You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何获取对象的UnsafeRawPointer及C++多参数接口调用问题

问题1:单独使用&obj报错的原因
  • Swift中的&不是通用的取地址运算符,它仅作为inout参数传递标记存在,仅允许在两种场景使用:
    1. 调用参数标注为inout的Swift函数时,放在实参前标记传递引用
    2. 调用导入到Swift的C/C++/Objective-C函数时,如果参数是指针类型,编译器提供语法糖,允许用&直接将变量转换为对应类型的指针传入函数
  • 你直接写var pointer = &obj不属于上述两种合法场景,编译器没有对应语法支持,因此抛出「Use of extraneous '&'」错误。

额外注意:如果MyCustomObj是类(引用类型),你用&obj传给C的void*实际传递的是「指向对象指针的指针」,而非对象本身的内存地址。如果C侧需要的是对象实例的地址,你需要用Unmanaged转换:

let objPtr = Unmanaged.passUnretained(obj).toOpaque()
foo(objPtr)

如果MyCustomObj是结构体/枚举等值类型,&obj传递的就是值本身的内存地址,符合常规预期。

问题2:多指针参数的写法是否正确

你写的嵌套withUnsafePointer写法是完全正确的:

withUnsafePointer(to: myObjFirst) { pFirst in
    withUnsafePointer(to: myObjSecond) { pSecond in
        foo(pFirst, pSecond)
    }
}

withUnsafe*系列方法返回的指针仅在闭包的执行周期内有效,嵌套写法可以保证两个指针的生命周期都覆盖到foo的调用过程,内存安全合规。
如果你的项目支持Swift 5.7及以上版本,可以用更简洁的非嵌套写法:

withUnsafePointers(to: myObjFirst, myObjSecond) { pFirst, pSecond in
    foo(pFirst, pSecond)
}

内容的提问来源于stack exchange,提问作者Sirop4ik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:18:01