【发布时间】:2014-06-03 16:12:51
【问题描述】:
在 Obj-C 中,可以通过以下方式遍历字母表:
for (char x='A'; x<='Z'; x++) {
在 Swift 中这是不可能的。知道我该怎么做吗?
【问题讨论】:
在 Obj-C 中,可以通过以下方式遍历字母表:
for (char x='A'; x<='Z'; x++) {
在 Swift 中这是不可能的。知道我该怎么做吗?
【问题讨论】:
在 Swift 中,您可以像这样在字符串上迭代字符:
斯威夫特 2
for char in "abcdefghijklmnopqrstuvwxyz".characters {
println(char)
}
Swift 1.2
for char in "abcdefghijklmnopqrstuvwxyz" {
println(char)
}
也许有更好的方法。
【讨论】:
for c in 'a'...'z' {} 怎么样?使用 C 字符类型而不是字符串。
这有点麻烦,但以下工作(Swift 3/4):
for value in UnicodeScalar("a").value...UnicodeScalar("z").value { print(UnicodeScalar(value)!) }
我怀疑这里的问题是“a”...“z”的含义对于不同的字符串编码可能会有所不同。
(老东西)
同样繁琐,但没有额外的中间变量:
for letter in map(UnicodeScalar("a").value...UnicodeScalar("z").value, {(val: UInt32) -> UnicodeScalar in return UnicodeScalar(val); })
{
println(letter)
}
【讨论】:
for i in 97...122{println(UnicodeScalar(i))}
【讨论】:
Swift 4.2 版本更简单
for char in "abcdefghijklmnopqrstuvwxyz" {
print(char)
}
【讨论】:
已针对 Swift 3.0 及更高版本更新
let startChar = Unicode.Scalar("A").value
let endChar = Unicode.Scalar("Z").value
for alphabet in startChar...endChar {
if let char = Unicode.Scalar(alphabet) {
print(char)
}
}
【讨论】:
此解决方案适用于 Swift 3.0,并且将打印出每个 OP 请求的值:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap { print($0) }
或者给你提供一个字母数组:
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap { $0.description }
【讨论】:
extension ClosedRange where Bound == UnicodeScalar {
func toArray() -> [UnicodeScalar] {
(lowerBound.value...upperBound.value).compactMap { UnicodeScalar($0) }
}
}
extension ClosedRange where Bound == String {
func toArray() -> [UnicodeScalar]? {
guard let lower = lowerBound.first?.unicodeScalars.first,
let upper = upperBound.first?.unicodeScalars.first else { return nil }
return (lower...upper).toArray()
}
}
("a"..."z").toArray() // option 1
(UnicodeScalar("a")...UnicodeScalar("z")).toArray() // option 2
【讨论】:
“纯函数式”Swift 5方式:
(Unicode.Scalar("A").value...Unicode.Scalar("Z").value).forEach({
let letter = Unicode.Scalar($0)!
print(letter)
/* do other stuff with letter here */
})
【讨论】:
print 是一种副作用),也不是“功能性的”(forEach 只能永远产生副作用)。但这是最好的方法。海事组织
你试过这个吗?
for var myChar:CChar = 65 ; myChar <= 90 ; ++myChar {
let x:String = String(format: "%c", myChar)
println(x)
}
如果你已经知道字符代码
【讨论】:
error: could not find an overload for 'init' that accepts the supplied arguments