如何在Swift 4中使用UnsafeMutablePointer

10

Objective-c有一个指向指针的概念。如果您取消引用第一个指针,则可以访问原始指针。

void makeFive(int *n) {
    *n = 5;
}

int n = 0;
makeFive(&n);
// n is now 5

当这个东西被桥接到Swift 3时,它变成了一个UnsafeMutablePointer

func makeFive(_ n: UnsafeMutablePointer<Int>) {
    n.memory = 5
}
var n: Int = 0
makeFive(&n)
// n is now 5

然而,从Swift 4开始,这种行为已经改变,memory属性不再可用。

在Swift 4中,makeFive(_ :)函数的等效方式是什么?

更新: 感谢Hamish的帮助,我现在知道"memory"被重命名为pointee。


7
从Swift 3开始,使用.pointee来访问指针的值;但是这里不要使用UnsafeMutablePointer。如果需要更改调用方的变量(这种情况应该不太常见),请使用inout - Hamish
感谢您的纠正,这确实很罕见!否则我会在Stack Overflow上找到它。我不知道名称已更改。我主要使用UnsafeMutablePointer以实现与Objective-C的兼容性,因为“inout”是仅适用于Swift的功能。 - DerrickHo328
1个回答

7

12
请注意:这个指针所指向的对象已经被初始化,因此你不应该在它上面调用initialize(to:)方法。在这种情况下它会“偶然地”工作,因为Pointee是一个平凡类型(Int),但对于非平凡类型的指向对象将产生未定义行为(我认为至少是这样;尽管最好的情况仍然存在内存泄漏)。你想要的操作是给指针所指向的对象赋值;可以通过设置指针的pointee属性来实现。 - Hamish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接