首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最新测试版中的Swift C void*和void**指针(4)

最新测试版中的Swift C void*和void**指针(4)
EN

Stack Overflow用户
提问于 2014-07-29 17:03:11
回答 3查看 3.3K关注 0票数 7

在以前的betas中,我可以将指向任何对象的指针传递给C,执行以下操作

代码语言:javascript
复制
var aString : NSString = "This is a string" // create an NSString
var anUnmanaged = Unmanaged.passUnretained(aString) // take an unmanaged pointer
var opaque : COpaquePointer = anUnmanaged.toOpaque() // convert it to a COpaquePointer
var mut : CMutablePointer = &opaque // this is a CMutablePointer
doSomething(mut) // pass the pointer to an helper function written in C

使用像这样的C函数:

代码语言:javascript
复制
void doSomething(void ** ptr)
{
   // do something with the pointer, change it and make it point to another nsstring for example
}

现在,(当然在Beta4中,甚至在Beta3中)从C到Swift的语法已经发生了变化

以前,doSomething函数期望一个CMutablePointer (现在已从Swift中删除),现在它期望一个:

代码语言:javascript
复制
UnsafePointer<UnsafePointer<()>>

()是一个要作废的类型别名

因此,从句法上讲更清晰。然而,现在我不能理解如何像在以前的betas中那样获取任何对象的空指针。

有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2015-08-24 05:02:20

这对我很有效:

代码语言:javascript
复制
var str = "Hello, playground"
var p: UnsafePointer<Void> = unsafeAddressOf(str)
票数 3
EN

Stack Overflow用户

发布于 2014-07-29 17:38:30

不确定这是否是正确的答案,我希望有人有更好的方法来做这件事。主要的问题是在Swift对象和空UnsafePointer ( UnsafePointer<()> )之间没有直接的转换,但是我设法通过一个COpaquePointer实现了它

代码语言:javascript
复制
    // since I can't go directly from NSMutableString to UnsafePointer<()> (which is UnsafePointer<Void>) i pass through a COpaquePointer
    var aString : NSMutableString = NSMutableString(string: "test") // create an NSString
    var anUnmanaged = Unmanaged.passUnretained(aString) // take an unmanaged pointer
    var opaque : COpaquePointer = anUnmanaged.toOpaque() // convert it to a COpaquePointer
    var anUnsafe : UnsafePointer<()> = UnsafePointer(opaque) // convert it to an UnsafePointer to Void ( () is a Typealias to Void) using the init(_ other: COpaquePointer) initializer

    doSomething(&anotherUnsafe)
票数 1
EN

Stack Overflow用户

发布于 2016-03-11 17:23:49

你能试试这个吗:

代码语言:javascript
复制
let strPtr = unsafeBitCast(aString, UnsafePointer<Void>.self)
let strPtrPtr = unsafeBitCast(strPtr, UnsafePointer<Void>.self) 

然后:

代码语言:javascript
复制
doSomething(strPtrPtr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25011669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档