当前位置: 首页 > 面试题库 >

Swift 2-UnsafeMutablePointer 反对

杜阳泽
2023-03-14
问题内容

如果我有类似的方法:

func someMethod(contextPtr: UnsafeMutablePointer<Void>)

我如何从中获取对象contextPtr

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

给出:

“无效”不能转换为“ 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: 另请参阅如何快速将自身转换为UnsafeMutablePointer
<Void>类型,以获取有关“桥接”和此处可以使用的一些辅助函数的更多信息。

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()
        // ...
    }
}


 类似资料:
  • 问题内容: 我是新手,并且在处理非托管CFString(或NSString)的指针时遇到一些困难。我正在一个CoreMIDI项目上工作,这暗示着使用UnsafeMutablePointer?>,如您在此函数中看到的: 我的问题是我想分配一个缓冲区以接收属性(_str)的内容,然后调用上面的函数,最后使用println在控制台中打印内容。 此刻我写了这个: 我没有在苹果开发者库中找到任何示例代码来使

  • 问题内容: 我想为此创建一个扩展名,仅影响… 我了解这些说明是相关的,但不确定如何: 扩展通用类型时,不提供类型参数列表作为扩展定义的一部分。而是在扩展程序的正文中提供原始类型定义的类型参数列表,并且原始类型参数名称用于引用原始定义的类型参数。 基本上,我正在尝试使用此方法: 在没有参数的情况下采取行动…这可能吗? 问题答案: Swift 3.1更新 从Swift 3.1(Xcode 8.3 be

  • 问题内容: 有没有一种方法可以将Swift结构的地址转换为无效的UnsafeMutablePointer? 我尝试了一下但没有成功: 谢谢! 编辑: 我实际上正在尝试 将上下文 移植到Swift中 学习CoreAudio 的第一个示例。 这是我到目前为止所做的: 我正在努力留在Swift中,但是如果事实证明这是一个问题而不是优势,那么我最终将链接到C函数。 编辑:底线 如果您因为试图在Swift中

  • 问题内容: 我有以下用Swift 2.2编写的代码: XCode 8突出显示第二行,并声称 无法使用类型为((UnsafeMutableRawPointer)’的参数列表来调用类型’UnsafeMutablePointer <_>’的初始化程序 虽然我很欣赏XCode告诉我的内容,但我不太了解如何将UnsafeMutableRawPointer更改为可接受的。 有谁知道如何将此代码转换为Swift

  • 问题内容: 我有一个映射到Swift的C函数定义为: 我正在尝试传递函数的路径并尝试过: 但是在path [i]上我得到了错误: ‘下标’不可用:不能下标Int范围的字符串 也不 也不管用 除了无法正常工作外,我认为还必须有一种更好,更轻松的方法来做到这一点。以前使用CString在StackOverflow上的答案似乎不再起作用。有什么建议? 问题答案: 使用CString在StackOverf

  • 问题内容: 调用以下代码时,试图将“ self”快速传递给C函数: 在这里将“自我”转换为UnsafeMutablePointer类型的理想方法是什么? 问题答案: 一个对象的指针(即,实例 引用类型 )可以被转换为一个(的夫特映射,在夫特3)和背部。在Objective-C中,您将编写 (有关这些转换的确切含义,请参见Clang ARC文档中的3.2.4桥接转换。) Swift 为此具有一种类型