2014-10-01 13 views
8

Proste pytanie - mam nadzieję, staram się generować prostą tablicę znaków, coś w stylu:Swift: wygenerować tablicę (SWIFT) znaków

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

i próbowałem następujące bezskutecznie

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

Zdaję sobie sprawę, że Swift używa Unicode, jaki jest właściwy sposób na zrobienie czegoś takiego?

(Uwaga: nie jest to kwestia dotycząca współdziałania ze starszą wersją Obj-C char, wyłącznie w Swift do testowania itp.).

Odpowiedz

12

To trochę kłopotliwe, aby uzyskać początkowy kod znaku (tj 'a' w C/Obj-C) w Swift, ale można to zrobić tak:

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

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

Dzięki, próbowałem znaleźć to odwzorowanie w dokumentach; nie mógł. PS. chcesz wypróbować pytanie o tangencjalnie powiązane pytanie? http://stackoverflow.com/questions/26152604/swift-slice-startindex-always-0 ;-) –

+0

Tak, to nie jest dobrze udokumentowane; musisz po prostu przekopać się przez wygenerowany automatycznie plik nagłówkowy i zobaczyć, co możesz zrobić;) –

2

Jeśli chcesz po prostu tablicę znanego zestawu:

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

rację, zdaję sobie sprawę, mogłem wpisać go, ale zastanawiałem się, w jaki sposób mapować znaki tak jak w C/obj- C itd. Dzięki –

+0

OK, przepraszam, znam tylko Swifta. –

11

Dzięki za przydatne odpowiedzi.

Używam wersji z jedną linią.

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

lub

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

Podoba mi się jedno-liniowy; jednak znalazłem, że muszę odwijać wyjście UnicodeScalar(), jak w: let xs = (0 .. <26) .map ({Character (UnicodeScalar ("a" .unicodeScalars.first! .value + $ 0)!) }) –

-1

Można po prostu użyć let alphabets: [UnicodeScalar] = Array("A"..."Z")

+0

To nie działa. To pokazuje błąd na moim placu zabaw – adev

+0

Możesz użyć zakresu '" A "..." Z "', aby utworzyć zakres od 'A' do' Z', ale 'Array()' nie zwróci tablic tych liter – Grubas