2016-03-30 48 views
2

假设我有一个变量斯威夫特像如何给本地迅速变量的地址分配给UnsafeMutablePointer

var i: CInt = 123; 

我怎样才能得到一个UnsafeMutablePointer<CInt>指向的i地址?

我知道可以通过调用

f(&i); 

我还知道,C指针可以迅速被表示为UnsafeMutablePointer通过此变量C函数void f(int *i)的地址。所以问题是如何将i的地址分配给这样的UnsafeMutablePointer。我本来期望的是类似

var p: UnsafeMutablePointer<CInt> = &i; 

var p = UnsafeMutablePointer<CInt>(&i); 

应该工作,但事实并非如此。我想我可以写一个C库,提供以下功能

int *noop(int *p){ return p;} 

可能在斯威夫特一样使用

var p = noop(&i); 

但我还没有尝试过了,它不可能是正确的解决方案。一定有一些更简单的事情。


请不要问我为什么要这样做。它更像是一个理解Swift和C互操作性设计的学术问题。

+1

相关:http://stackoverflow.com/questions/29976346/why-can-t-i-initialize-a-swift-unsafemutablepointeruint32-with-myuint32-or。 –

回答

3

您正在寻找withUnsafeMutablePointer(_: _:)。它采用T类型的inout参数和采用UnsafeMutablePointer<T>类型参数的块。它被用作这样的:

var i: Int = 0 
withUnsafeMutablePointer(&i) { (pointer) in 
    f(pointer) 
} 
+0

这是我正在寻找的功能。如果你可以通过初始化'var p:UnsafeMutablePointer = nil'并在封闭内部分配'p = pointer'(而不是调用'f')来更新你的答案,那会很好。那么这将是对问题的直接回答。谢谢。 – dastrobu

+0

@dastrobu:请注意,在withUnsafeMutablePointer闭包之外使用指针是不安全的。如果没有其他变量引用并且编译器决定重用内存,则指向的内存位置可能会失效。 –

+0

好点。虽然我怀疑在这种情况下我会被重复使用。但是这澄清了为什么'withUnsafeMutablePointer'接受了封闭,为此我首先没有明显的原因。 – dastrobu

相关问题