Swift 2 - UnsafeMutablePointer<Void> 对象

标签 swift pointers swift2

如果我有这样的方法:

func someMethod(contextPtr: UnsafeMutablePointer<Void>)

如何从 contextPtr 中获取对象?

func someMethod(contextPtr: UnsafeMutablePointer<Void>){    
    let object:MyObject = contextPtr.memory
}

给出:

'Void' is not convertible to 'MyObject'

秘诀是什么


更多细节:

我实际上在这里做的是为 SCNetworkReachability 设置一个全局回调函数:

func callback(reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer<Void>) {

    let r:Reachability = info.memory
}

然后按如下方式添加回调:

var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
var s = self
withUnsafeMutablePointer(&s) {
    context.info = UnsafeMutablePointer($0)
}
SCNetworkReachabilitySetCallback(reachability, callback, &context)

最佳答案

这应该有效:将对象指针作为不透明的非托管指针传递 到回调:

context.info = UnsafeMutablePointer(Unmanaged.passUnretained(myObject).toOpaque())
SCNetworkReachabilitySetCallback(reachability, callback, &context) 

并通过以下方式在回调中检索:

func callback(reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutablePointer<Void>) {

    let myObject = Unmanaged<MyObject>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()

}

当然这假设存在一些对该对象的强引用 只要设置了回调,这样对象就不会 释放。

更新:请注意,从对象指针到 void 指针的两种转换 如果您愿意使用“不安全”功能,则可以简化和返回:

context.info = unsafeAddressOf(myObject)
// ...
myObject = unsafeBitCast(info, MyObject.self)

据我所知,生成的汇编代码是相同的。

更新 2:另请参阅 How to cast self to UnsafeMutablePointer<Void> type in swift了解更多信息 关于“桥接”和一些可以在这里使用的辅助函数。


Swift 3 更新(Xcode 8 beta 6):

var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
context.info = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())

// ...

func callback(reachability:SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) {
    if let info = info {
        let myObject = Unmanaged<MyObject>.fromOpaque(info).takeUnretainedValue()
        // ...
    }
}

关于Swift 2 - UnsafeMutablePointer<Void> 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786883/

相关文章:

迁移到 Swift 2 后未显示 UICollectionView 项目

Swift Tabbar Controller 栏按钮项目

ios - 如何让 SwiftUI View 扩大可用空间?

ios - 闭包无法隐式捕获变异的 self 参数

c - pthread、指针和更多 C 语言中令人头疼的问题

c - 在C中动态分配内存给常量char指针?

ios - 键入时将字符附加到文本字段

swift - 本地化问候语的问题

swift - 如何在从命令行编译的 Swift 应用程序中使用文件夹?

c - MPI 程序空指针