【问题标题】:Using termios in Swift在 Swift 中使用 termios
【发布时间】: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


    【解决方案1】:

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

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

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

    然而,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+ 更新了代码。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-16
      • 2013-12-06
      • 2015-11-04
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多