在 Swift 中遍历字母表
Posted
技术标签:
【中文标题】在 Swift 中遍历字母表【英文标题】:Iterate through alphabet in Swift 【发布时间】:2014-06-03 16:12:51 【问题描述】:在 Obj-C 中,可以通过以下方式遍历字母表:
for (char x='A'; x<='Z'; x++)
在 Swift 中这是不可能的。知道我该怎么做吗?
【问题讨论】:
【参考方案1】:在 Swift 中,您可以像这样在字符串上迭代字符:
斯威夫特 2
for char in "abcdefghijklmnopqrstuvwxyz".characters
println(char)
Swift 1.2
for char in "abcdefghijklmnopqrstuvwxyz"
println(char)
也许有更好的方法。
【讨论】:
你尝试过类似 for char in "a".."z" 的方法吗?我没有 SDK,但我无法尝试,只能猜测。 :) @GokhanArik - 好主意,但它不起作用 :( -- “无法将表达式的类型 'Range' 转换为类型 '_SignedInteger” 我试过了,但它不起作用:(我从洛根那里知道上述解决方案(谢谢!),但我认为,有一种方法可以不用输入字母;)for c in 'a'...'z'
怎么样?使用 C 字符类型而不是字符串。
那么其他国家的字母表呢?挪威字母表是“abc...xyzæøå”(即末尾多出三个字符)。因此,正如@logan 所建议的那样,您最好的选择似乎是实际写出字母表。另外你也可以使用Array("abcde...xyzæøå") 直接获取数组版本。【参考方案2】:
这有点麻烦,但以下工作(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)
【讨论】:
谢谢,希望您不介意为 Swift 4 进行编辑。当然,您可以重新编辑以使其成为您自己的风格。【参考方案3】:for i in 97...122println(UnicodeScalar(i))
【讨论】:
【参考方案4】:Swift 4.2 版本更简单
for char in "abcdefghijklmnopqrstuvwxyz"
print(char)
【讨论】:
【参考方案5】:已针对 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)
【讨论】:
如果你想把这个字符保存在字符串中,那么就这样做 let startChar = Unicode.Scalar("a").value let endChar = Unicode.Scalar("z").value var s :String = "" 用于 startChar...endChar if let char = Unicode.Scalar(alphabet) s += "(char)" print(s) 如果你想把这个字符保存在字符串中,那么就这样做 let startChar = Unicode.Scalar("a").value let endChar = Unicode.Scalar("z").value var s :String = "" 用于 startChar...endChar if let char = Unicode.Scalar(alphabet) s += "(char)" print(s)【参考方案6】:此解决方案适用于 Swift 3.0,并且将打印出每个 OP 请求的值:
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap print($0)
或者给你提供一个字母数组:
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.flatMap $0.description
【讨论】:
【参考方案7】:详情
斯威夫特 5.3 版本 12.4 (12D4e)解决方案
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
【讨论】:
【参考方案8】:“纯函数式”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
只能永远产生副作用)。但这是最好的方法。海事组织
这就是为什么“纯功能”用引号引起来。
您至少可以通过使用地图使其正常运行
map() 生成一个数组。主题启动器想要迭代。那是不同的任务。我的代码迭代。所以这就是解决方案。【参考方案9】:
你试过这个吗?
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
以上是关于在 Swift 中遍历字母表的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中循环遍历 Alamofire JSON 结果