7

我试图了解指针在 Swift 中的使用,特别是:Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer. 我有几个关于这个主题的问题。

  1. UnsafePointer <T>等于const T * Pointerin ? 在 C中UnsafeMutablePointer <T>等于T * Pointer

  2. Unsafe[Mutable]Pointer和 和有什么不一样UnsafeRaw[Mutable]Pointer

  3. 为什么会这样编译

func receive(pointer: UnsafePointer<Int> ) {
    print("param value is: \(pointer.pointee)")
}

var a: Int = 1
receive(pointer: &a) // prints 1

但这给了我一个错误?

var a: Int = 1
var pointer: UnsafePointer<Int> = &a // error : Cannot pass immutable value of type 'Int' as inout argument
4

1 回答 1

5
  1. UnsafePointer <T>等于const T * Pointerin ? 在 C中UnsafeMutablePointer <T>等于T * Pointer

好吧,在 Swift 应用程序中使用桥接头来查看 C 指针是如何桥接的:

const int *myInt;
int *myOtherInt;

桥梁到

var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
  1. Unsafe[Mutable]Pointer和 和有什么不一样UnsafeRaw[Mutable]Pointer

Swift 3 添加了一个UnsafeRawPointer API来替换Unsafe[Mutable]Pointer<Void>类型。Swift 中不再允许在不同类型的指针之间进行转换。相反,API 提供接口 (.assumingMemoryBound(to:).bindMemory(to:capacity:)) 将内存绑定到类型。

关于问题 3,与号表示变量为inout我不相信你可以声明一个变量,inout除非它被直接修改底层内存的函数使用,但我会让专家纠正我。相反,使用withUnsafePointer.

感谢 Martin 的有用评论,这种语法在 Swift 中从未有效,并且没有安全的方法来创建指向 Swift 变量的“自由指针”。

于 2017-02-22T14:49:41.807 回答