在Swift中为引用的C结构中的属性设置值

时间:2015-07-06 15:15:55

标签: swift

我要做的是修改我引用的C结构的值,如下所示:

在BridgingHeader.h中:

struct info_type {
    int priority;
};

在ViewController.swift中:

class MyClass {
    func viewDidLoad() {
        var info = info_type()
        info.priority = 2    
        processInfo(&info)
    }

    func processInfo(infoRef: UnsafePointer<info_type>) {
        info.memory.priority = 1
    }
}

但是,代码在Xcode中触发“由于信号导致命令失败:中止陷阱:6”。打开构建输出我看到了

Assertion failed: (GetSetInfo.getInt().hasValue()), function getSetterAccessibility, file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.0.42.3/src/swift/include/swift/AST/Decl.h, line 4070.
0  swift                    0x0000000106d17b9b llvm::sys::PrintStackTrace(__sFILE*) + 43
1  swift                    0x0000000106d182db SignalHandler(int) + 379
2  libsystem_platform.dylib 0x00007fff8eaacf1a _sigtramp + 26
3  libsystem_platform.dylib 0x00007fff5aee4bec _sigtramp + 3426974956
4  libsystem_c.dylib        0x00007fff8ef73b53 abort + 129
[...]

我做错了什么或者我偶然发现了Xcode错误?我正在使用Xcode 7.0 beta 2(版本7.0 beta(7A121l))

1 个答案:

答案 0 :(得分:2)

由于processInfo()方法修改指向的内存 通过infoRef,参数必须声明为 mutable 指针:

func processInfo(infoRef: UnsafeMutablePointer<info_type>) {
    infoRef.memory.priority = 1
}

这会按预期编译并运行。

Xcode 6.4为您的代码发出正确的错误消息:

func processInfo(infoRef: UnsafePointer<info_type>) {
    infoRef.memory.priority = 1 // error: cannot assign to the result of this expression
}

但Xcode 7 beta 2崩溃,这是一个错误。