将结构从ObjC传递给Swift

时间:2015-06-07 17:17:54

标签: ios swift

尝试使用从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

1 个答案:

答案 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