尝试使用从ObjC到Swift的结构似乎并不那么容易。我最终得到一个不安全的指针,我不知道我是否能够可靠地投射。
以下是代码:
//
// In OBJC land
//
// Type declared as a struct
typedef struct node {
int children_count;
} node_t;
// Super class has a property
@property (nonatomic, assign, readonly) node_t *node;
//
// In SWIFT land
//
// Derived class tries to set the property inside the C struct
let n: UnsafeMutablePointer<node_t> = super.node // As swift compiler sees it
n.children_count = 0 // ERR!!!
我真的需要在这里应用unsafeBitcast,还是有一种更简单/更安全,更优雅的方式来转换似乎常见的情况?
更新:
我尝试使用内存访问结构的元素,我收到了EXC_BAD_INSTRUCTION
var node: node_t = self.node.memory
node.children_count = 42
UPDATE CONT'D&amp; FINALE
我得到了它的工作。感谢@ matt的耐心,确保我完全了解'记忆'访问权限。另一个技巧是在一个连续的语句中实现赋值,如下所示:
var node: UnsafeMutablePointer<node_t> = self.node
node.memory.children_count = 42
如果我执行以下操作,则不会通过函数调用提交更改:
var node: node_t = self.node.memory
node.children_count = 42
答案 0 :(得分:1)
一个问题是,不 a&#34;频繁的场景&#34;。事实上,这是一件非常奇怪的事情:
@property (nonatomic, assign, readonly) node_t *node;
这个东西(node_t
)是一个C结构。那你为什么要一个指针呢?也许你别无选择,但通常情况下只需将结构本身作为属性:
@property (readonly) node_t *node;
以这种方式,属性作为名为node_t
的Swift结构到达,并且如果你有一个var
引用(不是let
,你已经写了它),您可以直接分配到children_count
,如您所料。
如果你坚持使用指针,那么你必须取消引用指针,不是吗?你不是那样做的。为此,请使用指针memory
:
n.memory.children_count = 0