在以前的betas中,我可以将指向任何对象的指针传递给C,执行以下操作
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函数:
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中删除),现在它期望一个:
UnsafePointer<UnsafePointer<()>>()是一个要作废的类型别名
因此,从句法上讲更清晰。然而,现在我不能理解如何像在以前的betas中那样获取任何对象的空指针。
有什么建议吗?
发布于 2015-08-24 05:02:20
这对我很有效:
var str = "Hello, playground"
var p: UnsafePointer<Void> = unsafeAddressOf(str)发布于 2014-07-29 17:38:30
不确定这是否是正确的答案,我希望有人有更好的方法来做这件事。主要的问题是在Swift对象和空UnsafePointer ( UnsafePointer<()> )之间没有直接的转换,但是我设法通过一个COpaquePointer实现了它
// 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)发布于 2016-03-11 17:23:49
你能试试这个吗:
let strPtr = unsafeBitCast(aString, UnsafePointer<Void>.self)
let strPtrPtr = unsafeBitCast(strPtr, UnsafePointer<Void>.self) 然后:
doSomething(strPtrPtr)https://stackoverflow.com/questions/25011669
复制相似问题