web-dev-qa-db-fra.com

Convertit la chaîne Swift en tableau

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];
}
112
Mr.KLD

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

  • un Array peut être créé à partir d'un SequenceType, et
  • String 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 Characters:

let string = "Hello ???????? ????????"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "????", "????", " ", "????????"]
293
Martin R

Modifier (Swift 4)

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

Modifier (Swift 2 & Swift 3)

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

Original (Swift 1.x)

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/

89
devxoul

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"

12
Frédéric Adda

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()
6
ScottyBlades
    let string = "hell0"
    let ar = Array(string.characters)
    print(ar)
4
William Hu

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>
2
onmyway133

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)
2
Alberto Barrera
func letterize() -> [Character] {
    return Array(self.characters)
}
1

Vous pouvez également créer une extension:

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}
1
fabrizioM