Swift:生成一个(Swift)字符数组

Chr*_*ver 12 string macos xcode ios swift

简单的问题 - 希望,我正在尝试生成一个简单的字符数组,其中包括:

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

并尝试了以下无济于事

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

我意识到Swift使用Unicode,这样做的正确方法是什么?

(注意,这不是关于与传统Obj-C char互操作的问题,严格来说在Swift中进行测试等).

Mik*_*e S 17

'a'在Swift中获取初始字符代码(即在c/Obj-C中)有点麻烦,但你可以这样做:

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

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


Dai*_*ima 17

谢谢你的有用答案.

我正在使用单线版.

let xs = (97...122).map({Character(UnicodeScalar($0))})
Run Code Online (Sandbox Code Playgroud)

要么

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


Ste*_*erg 8

如果您只想要一个已知集合的数组:

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]
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 7

Xcode 10•Swift 4.2

extension ClosedRange where Bound == Unicode.Scalar {
    static let asciiPrintable: ClosedRange = " "..."~"
    var range: ClosedRange<UInt32>  { return lowerBound.value...upperBound.value }
    var scalars: [Unicode.Scalar]   { return range.compactMap(Unicode.Scalar.init) }
    var characters: [Character]     { return scalars.map(Character.init) }
    var string: String              { return String(scalars) }
}
Run Code Online (Sandbox Code Playgroud)
extension String {
    init<S: Sequence>(_ sequence: S) where S.Element == Unicode.Scalar {
        self.init(UnicodeScalarView(sequence))
    }
}
Run Code Online (Sandbox Code Playgroud)
let characters = ("a"..."z").characters  // "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"]
let string = ("a"..."z").string          // "abcdefghijklmnopqrstuvwxyz"
Run Code Online (Sandbox Code Playgroud)
let range = ClosedRange.asciiPrintable         // {lowerBound " ", upperBound "~"}   32...126
let characters = range.characters  // [" ", "!", """, "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "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", "[", "\\", "]", "^", "_", "`", "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", "{", "|", "}", "~"]
let string = range.string          // " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
Run Code Online (Sandbox Code Playgroud)