如何在 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 3 中使用 Alamofire 4 解析这个 json?
如何在 Swift 4 中使用 FetchedResultsController 获取 DateSectionTitles