现在我们已经到了Swift 2.0,我决定将我尚未完成的OS X应用程序转换为Swift。正在取得进展,但我在使用termios时遇到了一些问题,需要一些澄清和建议。
在Swift中,termios struct被视为struct,这并不奇怪,但令人惊讶的是,struct中的控制字符数组现在是一个元组。我期望它只是一个数组。正如你可能想象的那样,我花了一段时间才弄明白这一点。在游乐场工作如果我这样做:
var settings:termios = termios()
print(settings)然后,我将为结构打印正确的详细信息。
在Obj-C中设置要使用的控制字符,例如,
cfmakeraw(&settings);
settings.c_cc[VMIN] = 1;其中VMIN是#define等于termios.h中的16。在Swift中我必须做
cfmakeraw(&settings)
settings.c_cc.16 = 1这是可行的,但有点不透明。我更喜欢使用类似以下内容的东西
settings.c_cc.vim = 1相反,但似乎找不到任何描述Swift“版本”的termios的文档。有没有人知道元组的元素是否有预先分配的名称,或者如果没有,有没有办法在事后分配名称?我是否应该创建自己的带有命名元素的元组,然后将其分配给settings.c_cc
有趣的是,尽管预处理器指令不应该在Swift中工作,但如果我这样做了
print(VMIN)
print(VTIME)然后打印正确的值,并且不会产生编译器错误。我很有兴趣对此进行任何澄清或评论。这是个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中定义的常量的我自己的版本。如果没有更好的选择,我很乐意走那条路。
发布于 2015-08-14 12:58:08
让我们从你的第二个问题开始,这个问题更容易解决。B38400在Swift中是可用的,只是类型错误。所以你必须显式地转换它:
var settings = termios()
cfsetspeed(&settings, speed_t(B38400))据我所知,你的第一个问题没有“好”的解决方案。固定大小的数组作为元组导入到Swift中,据我所知,您不能使用变量来处理元组元素。
但是,Swift 会将从C导入的结构的内存布局保留为 confirmed by Apple engineer Joe Groff:。因此,您可以获取元组的地址,并将其重新绑定到指向元素类型的指针:
var settings = termios()
withUnsafeMutablePointer(to: &settings.c_cc) { (tuplePtr) -> Void in
tuplePtr.withMemoryRebound(to: cc_t.self, capacity: MemoryLayout.size(ofValue: settings.c_cc)) {
$0[Int(VMIN)] = 1
}
}(针对Swift 4+更新的代码。)
https://stackoverflow.com/questions/31465943
复制相似问题