Fractionner une chaîne en un tableau dans Swift?

688

Disons que j'ai une chaîne ici:

var fullName: String = "First Last"

Je souhaite diviser la base de chaîne sur un espace blanc et affecter les valeurs à leurs variables respectives

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

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

De plus, il arrive que les utilisateurs n'aient pas de nom de famille.

blee908
la source
13
Salut, je n'ai pas mon Mac à vérifier. Mais vous pouvez essayer 'fullName.componentsSeparatedByString (string: "")' Ne copiez et ne collez pas, utilisez la fonction de saisie semi-automatique pour obtenir la bonne fonction.
David Gölzhäuser
Si vous ne divisez que par un caractère, l'utilisation fullName.utf8.split( <utf-8 character code> )fonctionne également (remplacez .utf8par .utf16pour UTF-16). Par exemple, le fractionnement +pourrait être effectué à l'aide defullName.utf8.split(43)
Jojodmo
Aussi, parfois les noms de famille ont des espaces en eux, comme dans "Daphne du Maurier" ou "Charles de Lint"
Berry

Réponses:

784

La manière Swift est d'utiliser la splitfonction globale , comme ceci:

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

avec Swift 2

Dans Swift 2, l'utilisation du fractionnement devient un peu plus compliquée en raison de l'introduction du type interne CharacterView. Cela signifie que String n'adopte plus les protocoles SequenceType ou CollectionType et vous devez plutôt utiliser la .characterspropriété pour accéder à une représentation de type CharacterView d'une instance de String. (Remarque: CharacterView adopte les protocoles SequenceType et 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
la source
98
Dans mes tests, componentsSeparatedByString est généralement beaucoup plus rapide, en particulier lorsqu'il s'agit de chaînes qui nécessitent un fractionnement en plusieurs morceaux. Mais pour l'exemple répertorié par l'OP, l'un ou l'autre devrait suffire.
Casey Perkins
9
À partir de Xcode 6.2b3, le fractionnement peut être utilisé comme split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false).
Pascal
14
N'oubliez pas que vous devez toujours utiliser l'ancienne componentsSeparatedByString()méthode si votre séparateur est plus long qu'un seul caractère. Et aussi cool que ce serait de dire let (firstName, lastName) = split(fullName) {$0 == ' '}, cela ne fonctionne pas, malheureusement.
NRitH
3
@Kashif alors vous pourriez utiliser split("a,b;c,d") {$0 == "," || $0 == ";"}ousplit("a,b;c,d") {contains(",;", $0)}
Ethan
4
Le code correct pour Xcode 7.0 est fullNameArr = fullName.characters.split {$ 0 == ""} .map (String.init). J'ai essayé de modifier, mais il a été rejeté.
skagedal
1017

Appelez simplement la componentsSeparatedByStringméthode sur votrefullName

import Foundation

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

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

Mise à jour pour Swift 3+

import Foundation

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

let name    = fullNameArr[0]
let surname = fullNameArr[1]
Chen-Tsu Lin
la source
3
Notez qu'il s'agit en fait d'un sous-jacent NSString(Swift les échange automatiquement lors de l'importation Foundation).
Can
1
Ce qui n'est plus le cas dans Swift 1.2, dans lequel Apple ne convertit plus automatiquement la chaîne de Swift en NSString.
elcuco
6
Cette réponse fonctionne dans Xcode 7 beta 4 et Swift 2.0. Xcode complète désormais automatiquement les méthodes Foundation sur les objets Swift String sans transtypage de type en NSString, ce qui n'est pas le cas dans Xcode 6.4 avec Swift 1.2.
Andrew
1
Cela n'a pas fonctionné dans le REPL jusqu'à ce que j'importe la Fondation.
Velizar Hristov
1
Cela fonctionne exactement comme prévu (ie fullNameArr est un [String]) dans Xcode 7.2.
Jon Cox
185

La méthode la plus simple pour ce faire consiste à utiliser componentsSeparatedBy:

Pour 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]

Pour 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
la source
Est-ce documenté quelque part, Maury? Et si j'ai besoin de me séparer d'autre chose que d'un seul personnage?
NRitH
10
@NRitH consider .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251
@Crashalot il y a deux fonctions: componentsSeparatedByStringetcomponentsSeparatedByCharactersInSet
rmp251
132

Swift Dev. 4.0 (24 mai 2017)

Une nouvelle fonction splitdans Swift 4 ( Beta ).

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

Production:

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

Accès aux valeurs:

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

Xcode 8.1 / Swift 3.0.1

Voici la façon dont plusieurs délimiteurs avec tableau.

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

Production:

["12", "37", "2", "5"]
LugiHaue
la source
8
Assurez-vous d'ajouter import Foundationà la classe dans laquelle vous utilisez ceci. #SavedYouFiveMinutes
Adrian
4
Attention (Swift 4): Si vous avez une chaîne comme let a="a,,b,c"et que vous utilisez, a.split(separator: ",")vous obtenez un tableau comme ["a", "b", c"]par défaut. Cela peut être modifié en utilisant omittingEmptySubsequences: falsece qui est vrai par défaut.
OderWat
2
Des divisions multi-caractères dans Swift 4+?
pkamb
57

Swift 4 ou version ultérieure

Si vous avez juste besoin de formater correctement un nom de personne, vous pouvez utiliser PersonNameComponentsFormatter .

La classe PersonNameComponentsFormatter fournit des représentations localisées des composants du nom d'une personne, tels que représentés par un objet PersonNameComponents. Utilisez cette classe pour créer des noms localisés lors de l'affichage des informations de nom de personne à l'utilisateur.


// 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."
}

entrez la description de l'image ici

éditer / mettre à jour:

Swift 5 ou version ultérieure

Pour séparer simplement une chaîne par des caractères non alphabétiques, nous pouvons utiliser la nouvelle propriété Character isLetter:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"
Leo Dabus
la source
1
@DarrellRoot vous avez juste besoin de mapper les sousfullName.split { $0.isWhitespace }.map(String.init)
Leo Dabus
2
J'adore cette nouvelle API, mais gardez à l'esprit qu'elle renvoie des sous-chaînes. J'avais besoin de Strings (et je voulais me séparer sur les espaces en général) alors j'ai fait ceci: let words = line.split{ $0.isWhitespace }.map{ String($0)} Merci @LeoDabus pour votre version (mon commentaire d'origine avait du code manquant). Je suggère également de déplacer la version Swift 5 en haut de la réponse.
Darrell Root
53

Comme alternative à la réponse de WMios, vous pouvez également utiliser componentsSeparatedByCharactersInSet, ce qui peut être pratique dans le cas où vous avez plus de séparateurs (espace vide, virgule, etc.).

Avec votre contribution spécifique:

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

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

Utilisation de plusieurs séparateurs:

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

// words contains ["Last", "First", "Middle"]
Antonio
la source
2
La réponse la plus utile à mon avis, car vous voudrez peut-être autoriser la séparation des chaînes avec ,ou ;ou tout autre séparateur
Chris
49

Swift 4

let words = "these words will be elements in an array".components(separatedBy: " ")
Policier
la source
34

La question des espaces blancs

Généralement, les gens réinventent ce problème et les mauvaises solutions encore et encore. Est-ce un espace? "" et qu'en est-il de "\ n", "\ t" ou d'un espace blanc unicode que vous n'avez jamais vu, en grande partie parce qu'il est invisible. Alors que vous pouvez vous en sortir avec

Une solution faible

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

Si jamais vous avez besoin de vous affranchir de la réalité, regardez une vidéo de la WWDC sur les chaînes ou les dates. En bref, il est presque toujours préférable de permettre à Apple de résoudre ce genre de tâche banale.

Solution robuste: utilisez NSCharacterSet

La façon de procéder correctement, à mon humble avis, est d'utiliser NSCharacterSetcar, comme indiqué précédemment, votre espace n'est peut-être pas ce que vous attendez et Apple a fourni un jeu de caractères d'espace. Pour explorer les différents jeux de caractères fournis, consultez la documentation du développeur NSCharacterSet d'Apple puis seulement alors, augmentez ou construisez un nouveau jeu de caractères s'il ne correspond pas à vos besoins.

NSCharacterSet espaces blancs

Renvoie un jeu de caractères contenant les caractères des catégories générales Unicode Z et TABULATION DE CARACTERES (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
la source
2
D'accord. La première chose qui m'est venue à l'esprit après avoir vu les réponses divisées par "" est la suivante: que se passe-t-il si le texte saisi contient plusieurs espaces consécutifs? Et s'il a des onglets? Espace pleine largeur (CJK)? etc.
Nicolas Miari
31

Dans Swift 4.2 et Xcode 10

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

Option 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!)

Option 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)

Option 3

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

Option 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!"]"

Par la documentation 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
la source
23

Swift 4 facilite beaucoup le fractionnement des caractères, utilisez simplement la nouvelle fonction de fractionnement pour les chaînes.

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

Maintenant, vous avez un tableau avec «salut» et «bonjour».

Jeroen Zonneveld
la source
Notez que cela ne renvoie pas un tableau de String, mais un tableau de Substring qui est difficile à utiliser.
Lirik
19

Mise à jour pour Swift 5 et la manière la plus simple

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: [",", " ", "!",".","?"])

Cela imprime,

["Bob", "hit", "a", "ball", "", "the", "hit", "BALL", "flyw", "far", "after", "it", "was "," hit "," "," Hello "," "," Hie "," "," How "," r "," u "," "]

Cependant, si vous souhaitez filtrer les chaînes vides,

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

Production,

["Bob", "hit", "a", "ball", "the", "hit", "BALL", "flyw", "far", "after", "it", "was", " appuyez sur "," Bonjour "," Hie "," Comment "," r "," u "]

Mais assurez-vous que la Fondation est importée

Mithra Singam
la source
17

Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Renvoie trois chaînes AAA, BBBetCCC
  • Filtre les champs vides
  • Gère plusieurs espaces et caractères de tabulation
  • Si vous souhaitez gérer de nouvelles lignes, remplacez-les .whitespacespar.whitespacesAndNewlines
tepl
la source
15

Swift 4, Xcode 10 et iOS 12 Update fonctionnent à 100%

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

Voir la documentation d'Apple ici pour plus d'informations.

Xcodian Solangi
la source
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

Long chemin:

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
la source
9

J'ai eu un scénario où plusieurs caractères de contrôle peuvent être présents dans la chaîne que je souhaite fractionner. Plutôt que de maintenir un tableau de ces derniers, je laisse juste Apple gérer cette partie.

Les éléments suivants fonctionnent avec Swift 3.0.1 sur iOS 10:

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

J'ai trouvé un cas intéressant, celui

méthode 1

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

Lorsque j'ai utilisé cette commande pour séparer un symbole des données chargées à partir du serveur , il peut se diviser pendant le test dans le simulateur et se synchroniser avec l'appareil de test, mais il ne se divisera pas dans l'application de publication et Ad Hoc

Cela me prend beaucoup de temps pour suivre cette erreur, elle pourrait être maudite à partir d'une version Swift, ou d'une version iOS ou ni

Il ne s'agit pas non plus du code HTML, car j'essaie de stringByRemovingPercentEncoding et cela ne fonctionne toujours pas

ajout 10/10/2015

dans Swift 2.0, cette méthode a été remplacée par

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

méthode 2

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

Lorsque j'ai utilisé cette commande, elle peut diviser les mêmes données qui se chargent correctement à partir du serveur


Conclusion, je suggère vraiment d'utiliser la méthode 2

string.componentsSeparatedByString("")
Sruit A.Suk
la source
1
Je dirais que cela est proche du statut "pas de réponse", dans la mesure où il s'agit principalement de commentaires sur les réponses existantes. Mais cela souligne quelque chose d'important.
rickster
8

La plupart de ces réponses supposent que l'entrée contient un espace - pas un espace blanc , et un seul espace à cela. Si vous pouvez faire cette hypothèse en toute sécurité, alors la réponse acceptée (de bennett) est assez élégante et aussi la méthode que j'utiliserai quand je le pourrai.

Lorsque nous ne pouvons pas faire cette hypothèse, une solution plus robuste doit couvrir les situations suivantes que la plupart des réponses ici ne prennent pas en compte:

  • tabulations / sauts de ligne / espaces (espaces blancs), y compris récurrents caractères
  • espace de début / fin
  • Caractères de nouvelle ligne Apple / Linux ( \n) et Windows ( \r\n)

Pour couvrir ces cas, cette solution utilise l'expression régulière pour convertir tous les espaces (y compris les caractères de nouvelle ligne récurrents et Windows) en un seul espace, les découpes, puis les divise par un seul espace:

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
la source
6

Ou sans fermetures, vous pouvez le faire dans Swift 2:

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

Étapes pour diviser une chaîne en un tableau dans Swift 4.

  1. attribuer une chaîne
  2. basé sur @ fractionnement.

Remarque: variableName.components (separedPar: "split keyword")

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
la source
4

Swift 4

let string = "loremipsum.dolorsant.amet:"

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

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

Production

loremipsum
dolorsant
amet:
total: 3
MrMins
la source
3

Disons que vous avez une variable nommée "Hello World" et si vous voulez la diviser et la stocker en deux variables différentes, vous pouvez utiliser comme ceci:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
Parth Barot
la source
3

Cela donne directement un tableau de pièces scindées

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

alors vous pouvez utiliser comme ça,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Yodagama
la source
3

Seule splitest la bonne réponse, voici la différence pour plus de 2 espaces.

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
la source
2
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)

Amr Lotfy
la source
2

Swift 2.2 Gestion des erreurs et chaîne capitalisée Ajouté:

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
la source
2

La gestion des chaînes est toujours un défi dans Swift et elle continue de changer de manière significative, comme vous pouvez le voir dans d'autres réponses. Espérons que les choses se calmeront et que cela deviendra plus simple. C'est la façon de le faire avec la version 3.0 actuelle de Swift avec plusieurs caractères de séparation.

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
la source
2

Je cherchais un fractionnement lâche , tel que PHP explodeoù des séquences vides sont incluses dans le tableau résultant, cela a fonctionné pour moi:

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

Production:

["First", ""]
AamirR
la source
1

Cela a encore changé en Bêta 5. Weee! C'est maintenant une méthode sur CollectionType

Vieux:

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

Nouveau:

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

Notes de version des pommes

Daniel H.
la source
1

Pour 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
la source
1

Voici un algorithme que je viens de construire, qui divisera a Stringpar any Characterdu tableau et si vous souhaitez conserver les sous-chaînes avec des caractères fractionnés, vous pouvez définir le swallowparamètre surtrue .

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
            }
        }
    }
}

Exemple:

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