我知道SWIFT元组不能在运行时建立索引.但是,我使用的是POSIX终端接口(由<termios.h>定义,它是libc的一部分).

在C代码中,我们可以通过执行以下操作来修改终端的状态:

termios_struct.c_cc[VMIN] = 0;
termios_struct.c_cc[VTIME] = 0;

将其翻译为SWIFT会引发一个错误,抱怨它是cannot access element using subscript for tuple type '(cc_t, cc_t, cc_t ...)' (aka '(UInt8, UInt8, UInt8 ...)').实际的元组大约有20个元素,全部为UInt8个.

我想我可以只打印VMINVTIME的值(由<termios.h>定义的常量),然后使用它们的值直接索引元组,但我不确定它们的值是否跨平台一致,这通常很麻烦.

处理这种情况的正确方法是什么?


编辑:这个问题是由this answer解决的另一个问题,名为Using termios in Swift.

推荐答案

answer you referenced为指南,我想出了以下似乎可行的扩展.

extension termios {
    subscript(c_cc index: Int32) -> cc_t {
        get {
            var settings = self
            var res: cc_t = 0
            withUnsafePointer(to: &settings.c_cc) { (tuplePtr) -> Void in
                tuplePtr.withMemoryRebound(to: cc_t.self, capacity: MemoryLayout.size(ofValue: self.c_cc)) {
                    res = $0[Int(index)]
                }
            }

            return res
        }
        set {
            var settings = self
            withUnsafeMutablePointer(to: &self.c_cc) { (tuplePtr) -> Void in
                tuplePtr.withMemoryRebound(to: cc_t.self, capacity: MemoryLayout.size(ofValue: settings.c_cc)) {
                    $0[Int(index)] = newValue
                }
            }
        }
    }
}

以下是一些示例代码:

var settings = termios()
print(settings.c_cc)
settings[c_cc: VMIN] = 1
print(settings.c_cc)
print(settings[c_cc: VMIN])

以下哪项输出:

(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0)
1

Swift相关问答推荐

@ MainActor + Combine不一致的编译器错误

动画过程中的SwiftUI重绘视图

减go 用SWIFT struct 填充的NSCountedSet

try 在小部件内部读取核心数据的SwiftUI总是返回空吗?

在SwiftUI中判断选项时避免重复查看

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

如何异步返回视图?什么?

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

关闭 SwiftUI TabView 中的子视图

OSX 中的 Popover 无法确定透明度

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

Swift:结果的失败类型不能是协议 - Type 'any ShadowError' cannot conform to Error

如何为 Swift UI 视图定义 struct ?

获取具有关联类型的协议的self

与 SwiftUI 中的 onChange 修饰符相比,objectWillChangeSequence 的目的是什么?

不要从 NumberFormatter 获取货币符号

我们如何显示关于 UITextField 是 xCode Swift 的建议?

Swift - 迭代 struct 对象时如何对其进行变异

在 Swift 中从服务器播放视频文件

iOS:如何检测用户是否订阅了自动更新订阅