Membagi sebuah String menjadi sebuah array di Swift?

686

Katakanlah saya punya string di sini:

var fullName: String = "First Last"

Saya ingin membagi basis string pada ruang putih dan menetapkan nilai ke variabel masing-masing

var fullNameArr = // something like: fullName.explode(" ") 

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]

Juga, terkadang pengguna mungkin tidak memiliki nama belakang.

blee908
sumber
13
Hai, saya tidak punya Mac untuk diperiksa. Tetapi Anda dapat mencoba 'fullName.componentsSeparatedByString (string: "")' Jangan salin dan tempel, gunakan fungsi pelengkapan otomatis, sehingga Anda mendapatkan fungsi yang tepat.
David Gölzhäuser
Jika Anda hanya membagi dengan satu karakter, menggunakan fullName.utf8.split( <utf-8 character code> )karya juga (ganti .utf8dengan .utf16untuk UTF-16). Misalnya, pemisahan +dapat dilakukan menggunakanfullName.utf8.split(43)
Jojodmo
Juga, kadang-kadang nama belakang memiliki spasi di dalamnya, seperti dalam "Daphne du Maurier" atau "Charles de Lint"
Berry

Jawaban:

784

Cara Swift adalah menggunakan splitfungsi global , seperti:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

dengan Swift 2

Dalam Swift 2 penggunaan split menjadi sedikit lebih rumit karena pengenalan tipe CharacterView internal. Ini berarti bahwa String tidak lagi mengadopsi protokol SequenceType atau CollectionType dan Anda harus menggunakan .charactersproperti untuk mengakses representasi tipe CharacterView dari instance String. (Catatan: CharacterView tidak mengadopsi protokol SequenceType dan CollectionType).

let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)

fullNameArr[0] // First
fullNameArr[1] // Last 
Ethan
sumber
98
Dalam pengujian saya, componentsSeparatedByString biasanya jauh lebih cepat, terutama ketika berhadapan dengan string yang membutuhkan pemisahan menjadi banyak bagian. Tetapi untuk contoh yang terdaftar di OP, cukuplah.
Casey Perkins
9
Pada Xcode 6.2b3 split dapat digunakan sebagai split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false).
Pascal
14
Ingatlah bahwa Anda masih perlu menggunakan componentsSeparatedByString()metode lama jika pemisah Anda lebih panjang dari satu karakter. Dan sekeren itu mengatakan let (firstName, lastName) = split(fullName) {$0 == ' '}, itu tidak berhasil, sedihnya.
NRitH
3
@ Kashif maka Anda bisa menggunakan split("a,b;c,d") {$0 == "," || $0 == ";"}atausplit("a,b;c,d") {contains(",;", $0)}
Ethan
4
Kode yang benar untuk Xcode 7.0 adalah membiarkan fullNameArr = fullName.characters.split {$ 0 == ""} .map (String.init). Sudah mencoba mengedit, tetapi ditolak.
skagedal
1015

Cukup panggil componentsSeparatedByStringmetode di email AndafullName

import Foundation

var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]

Pembaruan untuk Swift 3+

import Foundation

let fullName    = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")

let name    = fullNameArr[0]
let surname = fullNameArr[1]
Chen-Tsu Lin
sumber
3
Perhatikan bahwa ini sebenarnya yang mendasarinya NSString(Swift secara otomatis bertukar saat mengimpor Foundation).
Dapat
1
Yang tidak lagi terjadi di Swift 1.2, di mana Apple tidak lagi mengubah Swift's String ke NSString secara otomatis.
elcuco
6
Jawaban ini berfungsi di Xcode 7 beta 4 dan Swift 2.0. Xcode sekarang secara otomatis melengkapi metode Foundation pada objek Swift String tanpa tipe casting ke NSString, yang tidak demikian dalam Xcode 6.4 dengan Swift 1.2.
Andrew
1
Itu tidak bekerja di REPL sampai saya mengimpor Foundation.
Velizar Hristov
1
Ini berfungsi persis seperti yang diharapkan (yaitu fullNameArr adalah an [String]) di Xcode 7.2.
Jon Cox
185

Metode termudah untuk melakukan ini adalah dengan menggunakan componentsSeparatedBy:

Untuk Swift 2:

import Foundation
let fullName : String = "First Last";
let fullNameArr : [String] = fullName.componentsSeparatedByString(" ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

Untuk Swift 3:

import Foundation

let fullName : String = "First Last"
let fullNameArr : [String] = fullName.components(separatedBy: " ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]
Wyetro
sumber
Apakah ini didokumentasikan di mana saja, Maury? Bagaimana jika saya perlu membagi sesuatu selain satu karakter?
NRitH
10
@NRitH pertimbangkan .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251
@ Crashalot ada dua fungsi: componentsSeparatedByStringdancomponentsSeparatedByCharactersInSet
rmp251
131

Swift Dev. 4.0 (24 Mei 2017)

Fungsi baru splitdi Swift 4 ( Beta ).

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)

Keluaran:

["Hello", "Swift", "4", "2017"]

Mengakses nilai:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017

Xcode 8.1 / Swift 3.0.1

Inilah cara beberapa pembatas dengan array.

import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)

Keluaran:

["12", "37", "2", "5"]
LugiHaue
sumber
8
Pastikan untuk menambahkan import Foundationke kelas tempat Anda menggunakannya. #SavedYouFiveMinutes
Adrian
4
Perhatian (Swift 4): Jika Anda memiliki string seperti let a="a,,b,c"dan Anda menggunakan a.split(separator: ",")Anda mendapatkan array seperti ["a", "b", c"]secara default. Ini dapat diubah menggunakan omittingEmptySubsequences: falseyang benar secara default.
OderWat
2
Adakah pemisahan multi-karakter di Swift 4+?
pkamb
57

Cepat 4 atau lebih baru

Jika Anda hanya perlu memformat nama orang dengan benar, Anda dapat menggunakan PersonNameComponentsFormatter .

Kelas PersonNameComponentsFormatter menyediakan representasi lokal dari komponen nama seseorang, seperti yang diwakili oleh objek PersonNameComponents. Gunakan kelas ini untuk membuat nama yang dilokalkan ketika menampilkan informasi nama orang kepada pengguna.


// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()

let name =  "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps  = nameFormatter.personNameComponents(from: name) {
    nameComps.namePrefix   // Mr.
    nameComps.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.

    // It can also be configured to format your names
    // Default (same as medium), short, long or abbreviated

    nameFormatter.style = .default
    nameFormatter.string(from: nameComps)   // "Steven Jobs"

    nameFormatter.style = .short
    nameFormatter.string(from: nameComps)   // "Steven"

    nameFormatter.style = .long
    nameFormatter.string(from: nameComps)   // "Mr. Steven Paul Jobs jr."

    nameFormatter.style = .abbreviated
    nameFormatter.string(from: nameComps)   // SJ

    // It can also be use to return an attributed string using annotatedString method
    nameFormatter.style = .long
    nameFormatter.annotatedString(from: nameComps)   // "Mr. Steven Paul Jobs jr."
}

masukkan deskripsi gambar di sini

edit / perbarui:

Cepat 5 atau lebih baru

Untuk memisahkan string dengan karakter bukan huruf, kita dapat menggunakan properti Karakter baru isLetter:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"
Leo Dabus
sumber
1
@DarrellRoot Anda hanya perlu memetakan substringfullName.split { $0.isWhitespace }.map(String.init)
Leo Dabus
2
Saya suka API baru itu tetapi ingatlah bahwa ia mengembalikan Substring. Saya membutuhkan Strings (dan ingin membagi pada whitespace secara umum) jadi saya melakukan ini: let words = line.split{ $0.isWhitespace }.map{ String($0)} Terima kasih @LeoDabus untuk versi Anda (komentar asli saya memiliki kode yang hilang). Saya juga menyarankan untuk memindahkan versi Swift 5 ke atas jawaban.
Darrell Root
53

Sebagai alternatif dari jawaban WMios, Anda juga dapat menggunakan componentsSeparatedByCharactersInSet, yang dapat berguna jika Anda memiliki lebih banyak pemisah (ruang kosong, koma, dll.).

Dengan input spesifik Anda:

let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["First", "Last"]

Menggunakan beberapa pemisah:

let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["Last", "First", "Middle"]
Antonio
sumber
2
Jawaban paling berguna dalam pandangan saya, karena Anda mungkin ingin mengizinkan pemisahan string dengan ,atau ;atau pemisah lainnya
Chris
49

Cepat 4

let words = "these words will be elements in an array".components(separatedBy: " ")
Polisi
sumber
34

Masalah spasi putih

Secara umum, orang menemukan kembali masalah ini dan solusi buruk berulang kali. Apakah ini ruang? "" dan bagaimana dengan "\ n", "\ t" atau karakter spasi putih unicode yang belum pernah Anda lihat, sebagian kecil karena itu tidak terlihat. Meskipun Anda bisa lolos

Solusi yang lemah

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")

Jika Anda perlu mengguncang kenyataan menonton video WWDC di string atau tanggal. Singkatnya, hampir selalu lebih baik untuk memungkinkan Apple untuk menyelesaikan tugas biasa semacam ini.

Solusi Kuat: Gunakan NSCharacterSet

Cara untuk melakukan ini dengan benar, IMHO, adalah menggunakan NSCharacterSetkarena seperti yang dinyatakan sebelumnya spasi putih Anda mungkin tidak seperti yang Anda harapkan dan Apple telah menyediakan set karakter spasi putih. Untuk menjelajahi berbagai rangkaian karakter yang disediakan, periksa dokumentasi pengembang NSCharacterSet Apple dan kemudian, baru kemudian, tambah atau buat rangkaian karakter baru jika tidak sesuai dengan kebutuhan Anda.

NSCharacterSet spasi putih

Mengembalikan set karakter yang mengandung karakter dalam Unicode General Category Zs dan CHARACTER TABULATION (U + 0009).

let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
Cameron Lowell Palmer
sumber
2
Sepakat. Hal pertama yang terjadi pada saya setelah melihat jawaban yang dipecah oleh "" adalah: Apa yang terjadi jika teks input berisi beberapa spasi berturut-turut? Bagaimana jika memiliki tab? Ruang lebar penuh (CJK)? dll.
Nicolas Miari
31

Di Swift 4.2 dan Xcode 10

//This is your str
let str = "This is my String" //Here replace with your string

Pilihan 1

let items = str.components(separatedBy: " ")//Here replase space with your value and the result is Array.
//Direct single line of code
//let items = "This is my String".components(separatedBy: " ")
let str1 = items[0]
let str2 = items[1]
let str3 = items[2]
let str4 = items[3]
//OutPut
print(items.count)
print(str1)
print(str2)
print(str3)
print(str4)
print(items.first!)
print(items.last!)

pilihan 2

let items = str.split(separator: " ")
let str1 = String(items.first!)
let str2 = String(items.last!)
//Output
print(items.count)
print(items)
print(str1)
print(str2)

Opsi 3

let arr = str.split {$0 == " "}
print(arr)

Opsi 4

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

Oleh Dokumentasi Apple ....

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", maxSplits: 1))//This can split your string into 2 parts
// Prints "["BLANCHE:", "  I don\'t want realism. I want magic!"]"

print(line.split(separator: " ", maxSplits: 2))//This can split your string into 3 parts

print(line.split(separator: " ", omittingEmptySubsequences: false))//array contains empty strings where spaces were repeated.
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", omittingEmptySubsequences: true))//array not contains empty strings where spaces were repeated.
print(line.split(separator: " ", maxSplits: 4, omittingEmptySubsequences: false))
print(line.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: true))
iOS
sumber
23

Swift 4 membuatnya lebih mudah untuk memisahkan karakter, cukup gunakan fungsi pemisahan baru untuk Strings.

Contoh: let s = "hi, hello" let a = s.split(separator: ",") print(a)

Sekarang Anda punya array dengan 'hai' dan 'halo'.

Jeroen Zonneveld
sumber
Perhatikan bahwa ini tidak mengembalikan array String, tetapi array Substring yang canggung untuk digunakan.
Lirik
19

Perbarui untuk Swift 5 dan cara paling sederhana

let paragraph = "Bob hit a ball, the hit BALL flew far after it was hit. Hello! Hie, How r u?"

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"])

Ini mencetak,

["Bob", "hit", "a", "ball", "", "the", "hit", "BALL", "terbang", "far", "setelah", "it", "adalah "," tekan "," "," Halo "," "," Hie "," "," Bagaimana "," r "," u "," "]

Namun, jika Anda ingin menyaring string kosong,

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})

Keluaran,

["Bob", "hit", "a", "ball", "the", "hit", "BALL", "terbang", "far", "setelah", "it", "was", " tekan "," Halo "," Hie "," Bagaimana "," r "," u "]

Tapi pastikan, Foundation diimpor

Mithra Singam
sumber
17

Cepat 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Mengembalikan tiga string AAA, BBBdanCCC
  • Menyaring bidang kosong
  • Menangani banyak spasi dan karakter tabulasi
  • Jika Anda ingin menangani jalur baru, ganti .whitespacesdengan.whitespacesAndNewlines
tepl
sumber
15

Swift 4, Xcode 10 dan iOS 12 Pembaruan 100% berfungsi

let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullNameArr[1] //Last

Lihat dokumentasi Apple di sini untuk informasi lebih lanjut.

Xcodian Solangi
sumber
13

Xcode 8.0 / Swift 3

let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")

var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last

Jauh:

var fullName: String = "First Last"
fullName += " " // this will help to see the last word

var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array

for Character in fullName.characters {
    if Character == " " {
        fullNameArr.append(newElement)
        newElement = ""
    } else {
        newElement += "\(Character)"
    }
}


var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last
NikaE
sumber
9

Saya punya skenario di mana beberapa karakter kontrol dapat hadir dalam string yang ingin saya bagi. Daripada mempertahankan array ini, saya hanya membiarkan Apple menangani bagian itu.

Berikut ini berfungsi dengan Swift 3.0.1 di iOS 10:

let myArray = myString.components(separatedBy: .controlCharacters)
CodeBender
sumber
8

Saya menemukan kasus yang menarik

metode 1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

Ketika saya menggunakan perintah ini untuk membagi beberapa simbol dari data yang diambil dari server , ia dapat membelah sambil menguji dalam simulator dan menyinkronkan dengan perangkat uji, tetapi itu tidak akan terpecah di aplikasi publik, dan Ad Hoc

Butuh banyak waktu untuk melacak kesalahan ini, Mungkin terkutuk dari beberapa Versi Swift, atau Versi iOS atau tidak

Ini bukan tentang kode HTML juga, karena saya mencoba untuk stringByRemovingPercentEncoding dan itu masih tidak berfungsi

Selain itu 10/10/2015

di Swift 2.0 metode ini telah diubah menjadi

var data:[String] = featureData.split {$0 == "\u{003B}"}

metode 2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

Ketika saya menggunakan perintah ini, itu dapat membagi data yang sama yang memuat dari server dengan benar


Kesimpulannya, saya sangat menyarankan untuk menggunakan metode 2

string.componentsSeparatedByString("")
Sruit A.Suk
sumber
1
Saya mengatakan ini dekat dengan status "bukan jawaban", karena sebagian besar komentar tentang jawaban yang ada. Tapi itu menunjukkan sesuatu yang penting.
rickster
8

Sebagian besar jawaban ini menganggap input berisi spasi - tidak putih ruang, dan satu ruang pada saat itu. Jika Anda dapat dengan aman membuat asumsi itu, maka jawaban yang diterima (dari bennett) cukup elegan dan juga metode yang akan saya gunakan ketika saya bisa.

Ketika kita tidak dapat membuat asumsi itu, solusi yang lebih kuat perlu untuk mencakup perubahan berikut yang sebagian besar jawaban di sini tidak dipertimbangkan:

  • tabs / baris baru / spasi (spasi putih), termasuk karakter berulang
  • spasi putih terkemuka / tertinggal
  • Karakter baris baru Apple / Linux ( \n) dan Windows ( \r\n)

Untuk mengatasi kasus-kasus ini, solusi ini menggunakan regex untuk mengonversi semua spasi putih (termasuk karakter baris baru dan Windows) ke satu ruang, trim, lalu bagi dengan satu ruang:

Swift 3:

let searchInput = "  First \r\n \n \t\t\tMiddle    Last "
let searchTerms = searchInput 
    .replacingOccurrences(
        of: "\\s+",
        with: " ",
        options: .regularExpression
    )
    .trimmingCharacters(in: .whitespaces)
    .components(separatedBy: " ")

// searchTerms == ["First", "Middle", "Last"]
DonVaughn
sumber
6

Atau tanpa penutupan Anda bisa melakukan ini di Swift 2:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
Rauli Rikama
sumber
6

Langkah-langkah untuk membagi string menjadi array di Swift 4.

  1. menetapkan string
  2. berdasarkan @ splitting.

Catatan: variableName.components (dipisahkan oleh: "kata kunci split")

let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)
Vidhyapathi Kandhasamy
sumber
4

Cepat 4

let string = "loremipsum.dolorsant.amet:"

let result = string.components(separatedBy: ".")

print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")

Keluaran

loremipsum
dolorsant
amet:
total: 3
MrMins
sumber
3

Katakanlah Anda memiliki variabel bernama "Hello World" dan jika Anda ingin membaginya dan menyimpannya ke dalam dua variabel yang berbeda, Anda dapat menggunakan seperti ini:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
Parth Barot
sumber
2
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)

Amr Lotfy
sumber
2

Swift 2.2 Penanganan Kesalahan & Kapitalisasi ditambahkan:

func setFullName(fullName: String) {
    var fullNameComponents = fullName.componentsSeparatedByString(" ")

    self.fname = fullNameComponents.count > 0 ? fullNameComponents[0]: ""
    self.sname = fullNameComponents.count > 1 ? fullNameComponents[1]: ""

    self.fname = self.fname!.capitalizedString
    self.sname = self.sname!.capitalizedString
}
Aqib Mumtaz
sumber
2

Penanganan string masih menjadi tantangan di Swift dan terus berubah secara signifikan, seperti yang Anda lihat dari jawaban lain. Semoga semuanya tenang dan menjadi lebih sederhana. Ini adalah cara untuk melakukannya dengan Swift versi 3.0 saat ini dengan beberapa karakter pemisah.

Swift 3:

let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)

// Or if the enums do what you want, these are preferred. 
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)
possen
sumber
2

Saya sedang mencari split longgar , seperti PHP di explodemana urutan kosong termasuk dalam array yang dihasilkan, ini bekerja untuk saya:

"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)

Keluaran:

["First", ""]
AamirR
sumber
2

Ini memberikan array bagian yang dibagi secara langsung

var fullNameArr = fullName.components(separatedBy:" ")

maka Anda bisa menggunakan seperti ini,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Yodagama
sumber
2

Hanya splitjawaban yang benar, berikut perbedaannya untuk lebih dari 2 spasi.

var temp = "Hello world     ni hao"
let arr  = temp.components(separatedBy: .whitespacesAndNewlines)
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr2 = temp.components(separatedBy: " ")
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr3 = temp.split(whereSeparator: {$0 == " "})
// ["Hello", "world", "ni", "hao"]
mistdon
sumber
1

Ini telah Berubah lagi dalam Beta 5. Weee! Sekarang metode di CollectionType

Tua:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}

Baru:

var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}

Catatan Rilis Apel

Daniel H.
sumber
1

Untuk swift 2, XCode 7.1:

let complete_string:String = "Hello world"
let string_arr =  complete_string.characters.split {$0 == " "}.map(String.init)
let hello:String = string_arr[0]
let world:String = string_arr[1]
Abinop
sumber
1

Berikut ini adalah algoritma yang baru saja saya buat, yang akan memisahkan Stringoleh Characterdari array dan jika ada keinginan untuk menjaga substring dengan karakter yang terpecah, seseorang dapat mengatur swallowparameter ketrue .

Xcode 7.3 - Swift 2.2:

extension String {

    func splitBy(characters: [Character], swallow: Bool = false) -> [String] {

        var substring = ""
        var array = [String]()
        var index = 0

        for character in self.characters {

            if let lastCharacter = substring.characters.last {

                // swallow same characters
                if lastCharacter == character {

                    substring.append(character)

                } else {

                    var shouldSplit = false

                    // check if we need to split already
                    for splitCharacter in characters {
                        // slit if the last character is from split characters or the current one
                        if character == splitCharacter || lastCharacter == splitCharacter {

                            shouldSplit = true
                            break
                        }
                    }

                    if shouldSplit {

                        array.append(substring)
                        substring = String(character)

                    } else /* swallow characters that do not equal any of the split characters */ {

                        substring.append(character)
                    }
                }
            } else /* should be the first iteration */ {

                substring.append(character)
            }

            index += 1

            // add last substring to the array
            if index == self.characters.count {

                array.append(substring)
            }
        }

        return array.filter {

            if swallow {

                return true

            } else {

                for splitCharacter in characters {

                    if $0.characters.contains(splitCharacter) {

                        return false
                    }
                }
                return true
            }
        }
    }
}

Contoh:

"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
DevAndArtist
sumber