2014-10-01 17 views
8

semplice domanda - si spera, sto cercando di generare un semplice array di caratteri, qualcosa in vena di:Swift: generare una serie di (Swift) caratteri

// trying to do something like this (pseudo code): 
let letters:[Character] = map(0..<26) { i in 'a' + i } 

e hanno cercato il seguente inutilmente

let a = Character("a") 
let z = Character("z") 
let r:Range<Character> = a..<z 
let letters:[Character] = map(a..<z) { i in i } 

Mi rendo conto che Swift usa Unicode, qual è il modo corretto di fare qualcosa del genere?

(Nota, questa non è una domanda sull'interopzione con il legacy Obj-C char, strettamente in Swift per i test, ecc.).

risposta

12

E 'un po' ingombrante per ottenere il codice carattere iniziale (cioè 'a' in c/Obj-C) a Swift, ma si può fare In questo modo:

let aScalars = "a".unicodeScalars 
let aCode = aScalars[aScalars.startIndex].value 

let letters: [Character] = (0..<26).map { 
    i in Character(UnicodeScalar(aCode + i)) 
} 
+0

Grazie, cercavo di trovare quella mappatura nei documenti; non poteva. PS. vuoi provare per una domanda bonus tangenzialmente correlata? http://stackoverflow.com/questions/26152604/swift-slice-startindex-always-0 ;-) –

+0

Sì, non è ben documentato; in pratica devi scavare attraverso il file di intestazione generato automaticamente e vedere cosa puoi fare lavorare;) –

2

Se si desidera solo una serie di una serie nota:

let str = "abcdefghijklmnopqrstuvwxyz" 
let characterArray = Array(str) 
println(characterArray) 

//[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z] 
+0

destro, mi rendo conto che avrei potuto scrivere fuori, ma chiedevo come si sarebbe mappare caratteri come si farebbe in C/obj- C ecc. Grazie –

+0

okay scusa, conosco solo Swift. –

11

Grazie per le risposte utili.

Sto usando la versione one-liner.

let xs = (97...122).map({Character(UnicodeScalar($0))}) 

o

let xs = (0..<26).map({Character(UnicodeScalar("a".unicodeScalars.first!.value + $0))}) 
+0

Mi piace il one-liner; tuttavia ho scoperto che avevo bisogno di scartare l'output di UnicodeScalar() come in: let xs = (0 .. <26) .map ({Character (UnicodeScalar ("a" .unicodeScalars.first! .value + $ 0)!) }) –

-1

Si può semplicemente utilizzare let alphabets: [UnicodeScalar] = Array("A"..."Z")

+0

Questo non funziona. Mostra un errore nel mio parco giochi – adev

+0

Puoi usare l'intervallo '" A "..." Z "' per creare l'intervallo da 'A' a' Z', ma 'Array()' non restituirà l'array di quelle lettere – Grubas