macos – 在Swift中使用termios

现在我们已经达到了
Swift 2.0,我决定将我尚未完成的OS X应用程序转换为Swift.取得进展但我遇到了使用termios的一些问题,可以使用一些澄清和建议.

termios结构在Swift中被视为一个结构,毫不奇怪,但令人惊讶的是结构中的控制字符数组现在是一个元组.我原以为它只是一个阵列.你可能想象我花了一段时间来解决这个问题.如果我这样做,在游乐场工作:

var settings:termios = termios()
print(settings)

然后我得到了为结构打印的正确细节.

在Obj-C中设置您将使用的控制字符,比如说

cfmakeraw(&settings);
settings.c_cc[VMIN] = 1;

其中VMIN在termios.h中的#define等于16.在Swift,我必须这样做

cfmakeraw(&settings)
settings.c_cc.16 = 1

哪个有效,但有点不透明.我更喜欢使用类似的东西

settings.c_cc.vim = 1

相反,但似乎找不到任何描述术语的Swift“版本”的文档.有没有人知道元组是否为它的元素预先指定了名称,或者如果没有,是否有办法在事后指定名称?我应该只使用命名元素创建自己的元组,然后将其分配给settings.c_cc吗?

有趣的是,尽管预处理器指令不适用于Swift,但如果我这样做的话

print(VMIN)
print(VTIME)

然后打印正确的值,不会产生编译器错误.我对此有任何澄清或评论感兴趣.这是一个错误吗?

剩下的问题与进一步配置termios有关.

cfsetspeed的定义如下

func cfsetspeed(_: UnsafeMutablePointer<termios>, _: speed_t) -> Int32

而speed_t的typedef为无符号长整数.在Obj-C中我们会这样做

cfsetspeed(&settings, B38400);

但由于B38400在termios.h中是#define,我们不能再这样做了. Apple是否已经在Swift中为这样的事情设置了替换全局常量,如果是这样,任何人都可以告诉我它们在哪里被记录.替代方案似乎只是插入原始值并失去可读性,或者创建我自己的先前在termios.h中定义的常量版本.如果没有更好的选择,我很高兴能走这条路.

最佳答案 让我们从你的第二个问题开始,这个问题更容易解决.

B38400在Swift中可用,它的类型错误.

所以你必须明确地转换它:

var settings = termios()
cfsetspeed(&settings, speed_t(B38400))

你知道的第一个问题没有“好”的解决方案.
固定大小的数组作为元组导入Swift,并且 – 据我所知 – 你不能用变量来处理元组元素.

你可以做一些指针杂耍并使用地址的事实
元组可以被视为元素数组的地址,
如在Convert an String to an array of int8

var settings = termios()
withUnsafeMutablePointer(&settings.c_cc) { (tuplePtr) -> Void in
    let ccPtr = UnsafeMutablePointer<cc_t>(tuplePtr)
    ccPtr[Int(VMIN)] = 1
}

但并不是说这个元组转换实际上没有记录,
所以在这种情况下你可能想保留你的

settings.c_cc.16 = 1

整数文字16.

点赞