【问题标题】:Objective-C pointer and swiftObjective-C 指针和 swift
【发布时间】:2016-12-22 17:32:45
【问题描述】:

我在关注一个apple document,可惜例子是写在objective-c上的,但是我对Swift语言有信心,有些东西的意思看不懂,尤其是这个例子:

void RunLoopSourcesPerformRoutine (void *info){
    RunLoopSource*  obj = (RunLoopSource*)info;
    [obj sourceFired];
}

这一行:RunLoopSource* obj = (RunLoopSource*)info;

参数:void *info表示info是一个指向void的指针,那么我可以放任何类型数据结构的地址,下面我看到各种苹果文档把这个:void *info翻译成swift语言是:

info: UnsafeMutableRawPointer?

现在,RunLoopSource* obj = (RunLoopSource*)info; 行表明 obj 是一个类型为:RunLoopSource 的变量,并为其分配了 (RunLoopSource *) info 的值,但是这句话究竟是什么意思? :(RunLoopSource *) info,以及它是如何翻译成 swift 语言的?

【问题讨论】:

标签: ios objective-c swift pointers unsafemutablepointer


【解决方案1】:

Swift 真的很讨厌指针。这两行代码可以转换成 Swift as

func RunLoopSourcesPerformRoutine(info: UnsafeMutableRawPointer) {
    let obj = info.assumingMemoryBound(to: RunLoopSource.self)
    obj.pointee.sourceFired()
}

【讨论】:

  • 谢谢,我也找到了这个,你觉得呢?让 obj : RunLoopSource = Unmanaged.fromOpaque(info!).takeUnretainedValue()
【解决方案2】:

这个特定的表达式是一个“类型转换”:它是说info,它被声明为一个指向未知的指针(void *)实际上被程序员知道是一个指向@的指针987654323@。这会强制更改表达式的类型以使编译器满意,因为它被分配给obj

它等同于在 Swift 中使用 as!,并且当你知道 void * 的语义但语法没有捕捉到它时是惯用的。

(这试图回答您所说的问题,但我不确定您是否正在寻找更多信息。如果是这样,请澄清,我或 Swift 中不安全指针方面的专家可以提供帮助。)

【讨论】:

  • 那么我如何使用 swift 中的类型转换来转换行:RunLoopSource* obj = (RunLoopSource*)info; .如何在 obj 类型的变量中进行“info”的类型转换:RunLoopSource in swift?
  • 看起来@Jenny 已经为您提供了剩下的答案!
【解决方案3】:

您正在处理的 (void *info) 是一个 C pointer-to-void,它以 UnsafeRawPointer 的形式进入 Swift。这意味着类型信息已被丢弃,内存正在其他地方进行管理。

为了按照您认为的那样使用这个东西,即 RunLoopSource,您需要将其明确表征为 RunLoopSource。在 C 中,您将进行转换,如您发布的示例代码:(RunLoopSource*)info。在 Swift 中,你重新绑定

请注意,在您的情况下,由于此 UnsafeMutableRawPointer 已包装在 Optional 中,并且必须在您可以做任何事情之前将其解包,这一事实使整个事情变得更加复杂。

那么,在您的情况下,假设 info 确实是绑定到 RunLoopSource 的 UnsafeMutableRawPointer?,您可以说:

let rlsptr = info!.assumingMemoryBound(to: RunLoopSource.self)
let rls = rlsptr.pointee

现在rls 一个 RunLoopSource,你可以随心所欲地使用它。但是请记住,内存是非托管的,因此您应该只在此时此地使用它。

编辑顺便说一句,Apple 有一个关于这整个问题的非常好的文档:https://swift.org/migration-guide/se-0107-migrate.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多