【问题标题】:Iterate through alphabet in Swift explanation在 Swift 解释中遍历字母表
【发布时间】:2018-03-08 20:53:36
【问题描述】:

我不小心写了这个简单的代码来在终端打印字母:

var alpha:Int = 97

while (alpha <= 122) {
    write(1, &alpha, 1)
    alpha += 1
}

write(1, "\n", 1)
//I'm using write() function from C, to avoid newline on each symbol

我得到了这个输出:

abcdefghijklmnopqrstuvwxyz
Program ended with exit code: 0

那么,问题来了:它为什么有效? 在我的逻辑中,它应该显示一行数字,因为正在使用一个整数变量。在 C 中,它是一个 char 变量,所以我们的意思是我们指向 ASCII 中某个索引处的一个符号。那么:

char alpha = 97;

将是一个指向“a”符号的代码点,通过在循环中递增 alpha 变量,我们将显示 ascii 到第 122 个的每个元素。

不过,在 Swift 中,我无法将整数分配给 Character 或 String 类型的变量。我使用了 Integer,然后声明了几个变量来分配 UnicodeScalar,但意外地发现,当我调用 write 时,我指向的是我的整数,而不是 UnicodeScalar 类型的新变量,尽管它可以工作!代码非常简短易读,但我完全不明白它是如何工作的,以及为什么。

有人遇到过这种情况吗?

【问题讨论】:

    标签: swift unicode ascii


    【解决方案1】:

    为什么会起作用?

    这是“偶然”的,因为整数是以小端字节序存储的。 整数97在内存中存储为8字节

    0x61 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    

    write(1, &amp;alpha, 1) 中,该内存位置的地址是 传递给write 系统调用。自最后一个参数 (nbyte) 为 1,该内存地址的第一个字节被写入 标准输出:即0x6197,字母的ASCII码 a.

    但在 Swift 中,我无法将整数分配给 Character 或 String 类型的变量。

    char 的 Swift 等价物是 CCharInt8 的类型别名:

    var alpha: CChar = 97
    

    这是一个不依赖于内存布局的解决方案 也适用于非 ASCII 字符:

    let first: UnicodeScalar = "α"
    let last: UnicodeScalar = "ω"
    
    for v in first.value...last.value {
        if let c = UnicodeScalar(v) {
            print(c, terminator: "")
        }
    }
    
    print()
    
    // αβγδεζηθικλμνξοπρςστυφχψω
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2014-07-29
      • 2018-11-02
      • 2015-05-31
      • 2022-11-14
      • 2015-10-13
      相关资源
      最近更新 更多