Question Swift: diviser une chaîne en un tableau


Dites que j'ai une chaîne ici:

var fullName: String = "First Last"

Je veux diviser la base de la 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 parfois que les utilisateurs n'aient pas de nom de famille.


526
2017-09-05 03:51


origine


Réponses:


Le moyen rapide est d'utiliser le mondial split fonction, comme ça:

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 de split 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 que vous devez utiliser .characters propriété pour accéder à une représentation de type CharacterView d'une instance 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 

692
2017-10-09 05:06



Il suffit d'appeler componentsSeparatedByString méthode sur votre fullName

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]

806
2017-09-05 04:12



La méthode la plus simple pour cela 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]

139
2017-09-05 04:09



Swift Dev. 4,0 (24 mai 2017)

Une nouvelle fonction split dans Swift 4 (Bêta).

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

Sortie:

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

Accéder 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)

Sortie:

["12", "37", "2", "5"]

84
2017-11-21 18:12



Comme alternative à la réponse de WMios, vous pouvez également utiliser componentsSeparatedByCharactersInSet, ce qui peut être utile dans le cas où vous avez plus de séparateurs (espace, 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"]

En utilisant plusieurs séparateurs:

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

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

45
2017-09-05 06:42



Swift 4

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

41
2018-06-12 20:38



Xcode 9 Swift 4 ou Xcode 8.2.1 • Swift 3.0.2

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

La classe PersonNameComponentsFormatter fournit localisée   les représentations des composantes du nom d'une personne, telles que représentées   par un objet PersonNameComponents. Utilisez cette classe pour créer localisée   noms 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.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.
    nameComps.namePrefix   // Mr.

    // It can also be convufgured 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."
}

enter image description here


33
2018-01-09 22:50