Comment convertir une chaîne "Hello" en un tableau ["H", "e", "l", "l", "o"] dans Swift?
En Objective-C, j'ai utilisé ceci:
NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
NSString *ichar = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
[characters addObject:ichar];
}
C'est encore plus facile à Swift:
let string : String = "Hello ???????? ????????"
let characters = Array(string)
println(characters)
// [H, e, l, l, o, , ????, ????, , ????????]
Cela utilise les faits qui
Array
peut être créé à partir d'un SequenceType
, etString
est conforme au protocole SequenceType
et son générateur de séquence énumère les caractères.Et puisque les chaînes Swift supportent pleinement Unicode, cela fonctionne même avec des caractères extérieurs au "Plan multilingue de base" (tel que ????) et avec des clusters de graphèmes étendus (tels que ????? ???, qui est en réalité composé de deux scalaires Unicode).
Mise à jour: à partir de Swift 2,String
n'est plus conforme à SequenceType
, mais la propriété characters
fournit une séquence de caractères Unicode. personnages:
let string = "Hello ???????? ????????"
let characters = Array(string.characters)
print(characters)
Cela fonctionne aussi dans Swift.
Mise à jour: à partir de Swift 4,String
est (à nouveau) une collection de ses Character
s:
let string = "Hello ???????? ????????"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "????", "????", " ", "????????"]
Dans Swift 4, vous n'avez pas besoin d'utiliser characters
pour utiliser map()
. Il suffit de faire map()
sur String.
let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>
Ou si vous préférez être plus court: "ABC".map(String.init)
(2 octets ????)
Dans Swift 2 et Swift 3, vous pouvez utiliser la fonction map()
sur la propriété characters
.
let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]
La réponse acceptée ne semble pas être la meilleure, car la séquence convertie en séquence String
n'est pas une séquence String
, mais Character
:
$ Swift
Welcome to Swift! Type :help for assistance.
1> Array("ABC")
$R0: [Character] = 3 values {
[0] = "A"
[1] = "B"
[2] = "C"
}
Ce qui suit fonctionne pour moi:
let str = "ABC"
let arr = map(str) { s -> String in String(s) }
La référence pour une fonction globale map()
se trouve ici: http://swifter.natecook.com/func/map/
Il existe également cette fonction utile sur String: components (separedBy: String)
let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]
Fonctionne bien pour traiter des chaînes séparées par un caractère comme ";" ou même "\ n"
Mise à jour pour Swift 4
Voici 3 façons.
//array of Characters
let charArr1 = [Character](myString)
//array of String.element
let charArr2 = Array(myString)
for char in myString {
//char is of type Character
}
Dans certains cas, ce que les gens veulent vraiment, c'est un moyen de convertir une chaîne en un tableau de petites chaînes de 1 caractère chacune. Voici un moyen très efficace de le faire:
//array of String
var strArr = myString.map { String($0)}
Swift
Voici 3 façons.
let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
//char is of type Character
}
Dans certains cas, ce que les gens veulent vraiment, c'est un moyen de convertir une chaîne en un tableau de petites chaînes de 1 caractère chacune. Voici un moyen très efficace de le faire:
var strArr = myString.characters.map { String($0)}
Ou vous pouvez ajouter une extension à String.
extension String {
func letterize() -> [Character] {
return Array(self.characters)
}
}
Ensuite, vous pouvez l'appeler comme ceci:
let charArr = "Cat".letterize()
let string = "hell0"
let ar = Array(string.characters)
print(ar)
Dans Swift 4, comme String
est une collection de Character
, vous devez utiliser map
let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>
La réponse de Martin R est la meilleure approche, et comme il l'a dit, comme String est conforme au protocole SquenceType, vous pouvez également énumérer une chaîne, en obtenant chaque caractère à chaque itération.
let characters = "Hello"
var charactersArray: [Character] = []
for (index, character) in enumerate(characters) {
//do something with the character at index
charactersArray.append(character)
}
println(charactersArray)
func letterize() -> [Character] {
return Array(self.characters)
}
Vous pouvez également créer une extension:
var strArray = "Hello, playground".Letterize()
extension String {
func Letterize() -> [String] {
return map(self) { String($0) }
}
}