【发布时间】:2015-07-16 22:57:45
【问题描述】:
现在我们已经达到了 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 中等于16 的#define。在 Swift 中我必须这样做
cfmakeraw(&settings)
settings.c_cc.16 = 1
这可行,但有点不透明。我更喜欢使用类似于
的东西settings.c_cc.vim = 1
相反,但似乎找不到任何描述 termios 的 Swift“版本”的文档。有谁知道元组是否为其元素预先分配了名称,或者如果没有,有没有办法在事后分配名称?我是否应该只使用命名元素创建自己的元组,然后将其分配给settings.c_cc?
有趣的是,尽管预处理器指令不应该在 Swift 中工作,但如果我这样做的话
print(VMIN)
print(VTIME)
然后打印正确的值并且不会产生编译器错误。我有兴趣对此进行任何澄清或cmet。是bug吗?
剩下的问题与 termios 的进一步配置有关。
cfsetspeed的定义为
func cfsetspeed(_: UnsafeMutablePointer<termios>, _: speed_t) -> Int32
并且speed_t 被定义为无符号长整数。在 Obj-C 中我们会这样做
cfsetspeed(&settings, B38400);
但由于B38400 是termios.h 中的#define,我们不能再这样做了。 Apple 是否在 Swift 中为此类事情设置了替换全局常量,如果是这样,任何人都可以告诉我它们记录在哪里。替代方法似乎只是插入原始值并失去可读性,或者创建我自己的以前在 termios.h 中定义的常量的版本。如果没有更好的选择,我很乐意走那条路。
【问题讨论】:
标签: macos swift swift2 termios