2017-02-22 21 views
2

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

  1. UnsafePointer <T>等于const T * Pointer吗?和UnsafeMutablePointer <T>等于T * Pointer在C?

  2. Unsafe[Mutable]PointerUnsafeRaw[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 

回答

3
  1. UnsafePointer <T>等于const T * Pointer吗?和UnsafeMutablePointer <T>等于T * Pointer在C?

那么,使用桥接报头以迅速应用看到C的指针如何桥接:

const int *myInt; 
int *myOtherInt; 

var myInt: UnsafePointer<Int32>! 
var myOtherInt: UnsafeMutablePointer<Int32>! 
  • Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer有什么区别?
  • 夫特3增加了一个UnsafeRawPointer API更换Unsafe[Mutable]Pointer<Void>类型。在Swift中不再允许不同类型的指针之间的转换。相反,API提供的接口(.assumingMemoryBound(to:).bindMemory(to:capacity:))将内存绑定到某个类型。

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

    感谢Martin的有用评论,这个语法在Swift中永远不会有效,并且没有安全的方法来为Swift变量创建“自由指针”。

    +1

    'var pointer:UnsafePointer =&a'永远无效,你的“解决方法”是不安全的:传递给'withUnsafePointer'闭包的指针只在执行闭包期间有效。它不能传递给封闭外部。 - 你*无法安全地将指针自由地传递给Swift变量。 –

    +0

    @MartinR谢谢,我会编辑我的答案。不太清楚OP想要什么,所以我不确定他们是否想要安全/不安全的行为。但很明显,他们是新手,更好地完全消除任何不安全的行为。 – JAL