在Swift解释中迭代字母表

时间:2018-03-08 12:25:05

标签: swift unicode ascii

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

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到122nd的每个元素。

在Swift中,我无法为Character或String类型变量分配整数。我使用了Integer,然后声明了几个变量来分配UnicodeScalar,但是我不小心发现当我调用write时,我指向我的整数,而不是UnicodeScalar类型的新变量,尽管它有效!代码非常简短易读,但我并不完全理解工作原理和原因。

有没有人有这样的情况?

1 个答案:

答案 0 :(得分:2)

  

为什么会这样?

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

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

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

  

在Swift中,我无法为Character或String类型变量分配整数。

Swift等效的charCCharInt8的类型别名:

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()

// αβγδεζηθικλμνξοπρςστυφχψω