如何在 swift 4 中使用 UnsafeMutablePointer

Posted

技术标签:

【中文标题】如何在 swift 4 中使用 UnsafeMutablePointer【英文标题】:How to use UnsafeMutablePointer in swift 4 【发布时间】:2017-09-20 18:44:11 【问题描述】:

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 属性不再可用。

makeFive(_:) 函数的 swift 4 等效项是什么?

更新 感谢 Hamish,我现在知道“内存”已重命名为指针。

【问题讨论】:

Swift 3 开始,它是 .pointee;但不要在这里使用UnsafeMutablePointer。如果您需要改变调用方变量,请使用inout(这不应该那么频繁)。 感谢您的更正,这确实是罕见的!否则我会在堆栈溢出中找到它。我不知道改名。我主要使用 UnsafeMutablePointer 来实现 Objective-C 兼容性,因为“inout”是一个 swift 唯一的功能。 【参考方案1】:

请查看:https://developer.apple.com/documentation/swift/unsafemutablepointer

func makeFive(_ n: UnsafeMutablePointer<Int>) 
    n.initialize(to: 5)

var n: Int = 0
makeFive(&n)
// n is now 5

【讨论】:

小心这个;指针已经初始化,所以你不应该真的在它上面调用initialize(to:)。它会发生在这种情况下工作,因为Pointee 是一个平凡的类型(Int),但会为非平凡的指针类型产生未定义的行为(我认为至少;虽然最好案例场景仍在泄漏内存)。你在这里想要的操作是assignment给pointee;这是通过设置指针的pointee 属性来完成的。

以上是关于如何在 swift 4 中使用 UnsafeMutablePointer的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4 中使用 UnsafeMutablePointer

Swift 4:如何使用 Alamofire 在参数中发布文件?

如何在 Swift 4 的可解码协议中使用自定义键?

如何在 Swift 3/4 中使用相机获取位置?

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

如何在 Swift 4 中使用 FetchedResultsController 获取 DateSectionTitles