Converti la stringa Swift in array


133

Come posso convertire una stringa "Hello" in un array ["H", "e", "l", "l", "o"] in Swift?

In Objective-C ho usato questo:

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

Risposte:


339

È ancora più facile in Swift:

let string : String = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
println(characters)
// [H, e, l, l, o,  , 🐶, 🐮,  , 🇩🇪]

Questo usa i fatti che

  • an Arraypuò essere creato da a SequenceTypee
  • Stringè conforme al SequenceTypeprotocollo e il suo generatore di sequenza enumera i caratteri.

E poiché le stringhe Swift hanno il pieno supporto per Unicode, questo funziona anche con caratteri esterni al "Piano multilingue di base" (come 🐶) e con cluster grapheme estesi (come 🇩🇪, che in realtà è composto da due scalari Unicode).


Aggiornamento: a partire da Swift 2, String non è più conforme SequenceType, ma la charactersproprietà fornisce una sequenza di caratteri Unicode:

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string.characters)
print(characters)

Funziona anche in Swift 3 .


Aggiornamento: A partire da Swift 4, String è (di nuovo) una raccolta dei suoi Characters:

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "🐶", "🐮", " ", "🇩🇪"]

1
Hai idea del perché provare a unire ( let joined = ", ".join(characters);) l'array provochi un 'String' is not identical to 'Character'errore?
Mohamad,

3
@Mohamad: l'enumerazione di una stringa produce una sequenza di caratteri, ma ", ".join(...)prevede una matrice di stringhe. La risposta di devxoul di seguito mostra come è possibile suddividere in una serie di stringhe.
Martin R,

2
@Fonix: charactersè una raccolta e una vista sui caratteri delle stringhe. La creazione di un array dai personaggi ne fa una copia. - Certo che puoi accedere direttamente ai personaggi: for i in string.characters.indices { print(string.characters[i]) }o semplicementefor c in string.characters { print(c) }
Martin R

2
@Fonix: ... D'altra parte, l'indicizzazione casuale in stringhe può essere lenta e può essere vantaggioso creare un array con tutti i caratteri una volta. Esempio: stackoverflow.com/questions/40371929/… .
Martin R,

2
@DaniSpringer: Swift 4 è attualmente in beta, avrai bisogno di Xcode 9 beta: developer.apple.com/swift/resources .
Martin R,

102

Modifica (Swift 4)

In Swift 4, non è necessario utilizzare charactersper usare map(). Fallo map()su String.

let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

O se preferisci un numero inferiore: "ABC".map(String.init)(2 byte 😀)

Modifica (Swift 2 e Swift 3)

In Swift 2 e Swift 3, è possibile utilizzare la map()funzione per la charactersproprietà.

let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]

Originale (Swift 1.x)

La risposta accettata non sembra essere la migliore, perché la sequenza convertita Stringnon è una Stringsequenza, ma Character:

$ swift
Welcome to Swift!  Type :help for assistance.
  1> Array("ABC")
$R0: [Character] = 3 values {
  [0] = "A"
  [1] = "B"
  [2] = "C"
}

Questo sotto funziona per me:

let str = "ABC"
let arr = map(str) { s -> String in String(s) }

Il riferimento per una funzione globale map()è qui: http://swifter.natecook.com/func/map/


12
Leggermente più corto:arr = map(str) { String($0) }
Martin R

1
Utilizzare Arrayinvece l' inizializzatore:Array("ABC".characters)
chrisamanse,

1
@chrisamanse, Non c'è differenza tra "ABC".characterse Array("ABC".characters).
Devxoul,

2
È diverso in Swift 3. "ABC".charactersrestituisce un tipo String.CharacterView. Per convertirlo in un array, in particolare di tipo [Character], dovresti usare l' Arrayinizializzatore su di esso.
chrisamanse,

2
@chrisamanse Oh, non lo sapevo. Mi sbagliavo. Grazie per segnalarlo. A proposito, intendevo [String]invece [Character]perché op voleva un array di stringhe :)
devxoul,

22

C'è anche questa utile funzione su String: components (separateBy: String)

let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]

Funziona bene per gestire le stringhe separate da un carattere come ";" o anche "\ n"


8

Aggiornato per Swift 4

Ecco 3 modi.

//array of Characters
let charArr1 = [Character](myString)

//array of String.element
let charArr2 = Array(myString)

for char in myString {
  //char is of type Character
}

In alcuni casi, ciò che la gente vuole davvero è un modo per convertire una stringa in una matrice di stringhe con una lunghezza di 1 carattere ciascuna. Ecco un modo super efficiente per farlo:

//array of String
var strArr = myString.map { String($0)}

Swift 3

Ecco 3 modi.

let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
  //char is of type Character
}

In alcuni casi, ciò che la gente vuole davvero è un modo per convertire una stringa in una matrice di stringhe con una lunghezza di 1 carattere ciascuna. Ecco un modo super efficiente per farlo:

var strArr = myString.characters.map { String($0)}

Oppure puoi aggiungere un'estensione a String.

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}

Quindi puoi chiamarlo così:

let charArr = "Cat".letterize()


3

La risposta di Martin R è l'approccio migliore e, come ha detto, poiché String è conforme al protocollo SquenceType, puoi anche enumerare una stringa, ottenendo ogni carattere su ogni iterazione.

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
O semplicemente for character in characters { charactersArray.append(character)}senza ilenumeration()
Tieme

3

In Swift 4, come Stringè una raccolta di Character, è necessario utilizzaremap

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

3

Un modo semplice per farlo è mapla variabile e restituire ciascuno Charactercome String:

let someText = "hello"

let array = someText.map({ String($0) }) // [String]

L'output dovrebbe essere ["h", "e", "l", "l", "o"].


1

Puoi anche creare un'estensione:

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

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

1
func letterize() -> [Character] {
    return Array(self.characters)
}

2
Potete fornire maggiori informazioni sul perché questo funzionerà? :)
pix

1
@pix Penso che intendesse che questa fosse una funzione definita in un'estensione di String. Lo aggiungerò alla mia risposta.
ScottyBlades,

1

per la funzione su String: components (separateBy: String)

in Swift 5.1

cambiare in:

string.split(separator: "/")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.