首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift中使用termios

在Swift中使用termios
EN

Stack Overflow用户
提问于 2015-07-17 06:57:45
回答 1查看 608关注 0票数 4

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

在Swift中,termios struct被视为struct,这并不奇怪,但令人惊讶的是,struct中的控制字符数组现在是一个元组。我期望它只是一个数组。正如你可能想象的那样,我花了一段时间才弄明白这一点。在游乐场工作如果我这样做:

代码语言:javascript
复制
var settings:termios = termios()
print(settings)

然后,我将为结构打印正确的详细信息。

在Obj-C中设置要使用的控制字符,例如,

代码语言:javascript
复制
cfmakeraw(&settings);
settings.c_cc[VMIN] = 1;

其中VMIN是#define等于termios.h中的16。在Swift中我必须做

代码语言:javascript
复制
cfmakeraw(&settings)
settings.c_cc.16 = 1

这是可行的,但有点不透明。我更喜欢使用类似以下内容的东西

代码语言:javascript
复制
settings.c_cc.vim = 1

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

有趣的是,尽管预处理器指令不应该在Swift中工作,但如果我这样做了

代码语言:javascript
复制
print(VMIN)
print(VTIME)

然后打印正确的值,并且不会产生编译器错误。我很有兴趣对此进行任何澄清或评论。这是个bug吗?

剩下的问题必须与termios的进一步配置有关。

cfsetspeed的定义如下所示

代码语言:javascript
复制
func cfsetspeed(_: UnsafeMutablePointer<termios>, _: speed_t) -> Int32

并且speed_t被定义为一个无符号的长整型。在Obj-C中,我们会这样做

代码语言:javascript
复制
cfsetspeed(&settings, B38400);

但是,由于B38400是termios.h中的#define,我们不能再这样做了。Apple是否在Swift中为这样的东西设置了替换的全局常量,如果是这样的话,谁能告诉我它们在哪里被记录下来?另一种选择似乎是只插入原始值并失去可读性,或者创建以前在termios.h中定义的常量的我自己的版本。如果没有更好的选择,我很乐意走那条路。

EN

回答 1

Stack Overflow用户

发布于 2015-08-14 12:58:08

让我们从你的第二个问题开始,这个问题更容易解决。B38400在Swift中是可用的,只是类型错误。所以你必须显式地转换它:

代码语言:javascript
复制
var settings = termios()
cfsetspeed(&settings, speed_t(B38400))

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

但是,Swift 会将从C导入的结构的内存布局保留为 confirmed by Apple engineer Joe Groff:。因此,您可以获取元组的地址,并将其重新绑定到指向元素类型的指针:

代码语言:javascript
复制
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+更新的代码。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31465943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档