【问题标题】:How to access UnsafeMutablePointer struct member如何访问 UnsafeMutablePointer 结构成员
【发布时间】:2015-11-04 15:25:04
【问题描述】:
let cfg: UnsafeMutablePointer <pjsua_config> = nil;
pjsua_config_default(cfg);
cfg.cb // Error: Value of type 'UnsafeMutablePointer<pjsua_config>' has no member 'cb'

如何投射cfg 来访问它的字段?我试图在 Apple 的 'Interacting with C API' document 中找到答案 但没有与此问题相关的信息。

【问题讨论】:

  • 怎么可能是零?
  • @ogres a let 可以是可选的
  • 我在你的声明末尾没有看到问号,我很确定你会得到该代码的编译器错误
  • @ogres,nil 被设置为指针,它不像 Swift 的对象那样工作,编译器也不会抱怨它。

标签: ios swift struct


【解决方案1】:

其实在“Interacting with C APIs”中有相关信息 章节:

当函数被声明为采用UnsafeMutablePointer&lt;Type&gt; 参数时,它可以接受以下任何一种:

  • ...
  • inout 表达式,其操作数是 Type 类型的存储左值,作为左值的地址传递
  • ...

因此,您可以简单地将(初始化的)pjsua_config 结构的地址作为“inout-parameter”与&amp; 一起传递,就像您在 C 中所做的那样:

var  cfg = pjsua_config() // creates a `struct pjsua_config` with all fields set to zero
pjsua_config_default(&cfg)

现在可以访问cfg.cb了,不用担心 内存管理。

【讨论】:

  • cfg 必须是指向结构的指针,而不是结构。 pjsua_config_default() 需要“UnsafeMutablePointer)”类型的参数
  • @gottlieb:是的,我知道。你试过了吗?不要忘记pjsua_config_default(&amp;cfg) 中的&amp;。我很确定它应该可以工作。
  • 不,它不起作用。错误消息是“& 与 UnsafeMutablePointer 类型的非 inout 参数一起使用”。嗯,很清楚为什么。
  • @gottlieb:我的错。 cfg 必须是 var
  • 是的,当然,我也错过了。它正在工作。谢谢:)
【解决方案2】:

我不知道你在做什么

pjsua_config_default() 方法,但要获取原始数据,您必须在指针上调用内存。

请查看工作示例:

var pt : UnsafeMutablePointer<Int>? // Optional

pt = UnsafeMutablePointer.alloc(1)

pt!.initialize(22)

pt!.memory  // returns your value

// Cleanup
pt!.destroy()
pt!.dealloc(1)
pt! = nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多