【问题标题】:Iterate through alphabet in Swift在 Swift 中遍历字母表
【发布时间】:2014-06-03 16:12:51
【问题描述】:

在 Obj-C 中,可以通过以下方式遍历字母表:

for (char x='A'; x<='Z'; x++) {

在 Swift 中这是不可能的。知道我该怎么做吗?

【问题讨论】:

    标签: ios 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...122{println(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
            猜你喜欢
            • 1970-01-01
            • 2013-06-15
            • 1970-01-01
            • 2014-07-29
            • 2015-05-31
            • 2022-11-14
            • 2017-10-10
            • 2011-11-10
            相关资源
            最近更新 更多