Swift 中的指针
Pointers in Swift
我试图理解指针在 Swift 中的使用,特别是:Unsafe[Mutable]Pointer
和 UnsafeRaw[Mutable]Pointer
。我有几个关于这个问题的问题。
UnsafePointer <T>
等于const T * Pointer
吗? UnsafeMutablePointer <T>
等于 C 中的 T * Pointer
?
Unsafe[Mutable]Pointer
和UnsafeRaw[Mutable]Pointer
有什么区别?
为什么这样编译
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
- Is
UnsafePointer <T>
equal to const T * Pointer
in ? and UnsafeMutablePointer <T>
is equal to T * Pointer
in C?
好吧,在 Swift 应用程序中使用桥接 header 看看 C 指针是如何桥接的:
const int *myInt;
int *myOtherInt;
连接到
var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
- What is the difference between
Unsafe[Mutable]Pointer
and UnsafeRaw[Mutable]Pointer
?
Swift 3 添加了一个UnsafeRawPointer API来代替Unsafe[Mutable]Pointer<Void>
类型。 Swift 中不再允许不同类型的指针之间的转换。相反,API 提供接口(.assumingMemoryBound(to:)
或 .bindMemory(to:capacity:)
)将内存绑定到一个类型。
关于问题3,&符号表示变量是inout
。 我不相信你可以将变量声明为 inout
除非它被直接修改底层内存的函数使用,但我会让专家纠正我。相反,使用 withUnsafePointer
.
感谢 Martin 的帮助评论,此语法在 Swift 中从未有效,并且没有安全的方法来创建 "free pointers" 到 Swift 变量。
我试图理解指针在 Swift 中的使用,特别是:Unsafe[Mutable]Pointer
和 UnsafeRaw[Mutable]Pointer
。我有几个关于这个问题的问题。
UnsafePointer <T>
等于const T * Pointer
吗?UnsafeMutablePointer <T>
等于 C 中的T * Pointer
?Unsafe[Mutable]Pointer
和UnsafeRaw[Mutable]Pointer
有什么区别?为什么这样编译
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
- Is
UnsafePointer <T>
equal toconst T * Pointer
in ? andUnsafeMutablePointer <T>
is equal toT * Pointer
in C?
好吧,在 Swift 应用程序中使用桥接 header 看看 C 指针是如何桥接的:
const int *myInt;
int *myOtherInt;
连接到
var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
- What is the difference between
Unsafe[Mutable]Pointer
andUnsafeRaw[Mutable]Pointer
?
Swift 3 添加了一个UnsafeRawPointer API来代替Unsafe[Mutable]Pointer<Void>
类型。 Swift 中不再允许不同类型的指针之间的转换。相反,API 提供接口(.assumingMemoryBound(to:)
或 .bindMemory(to:capacity:)
)将内存绑定到一个类型。
关于问题3,&符号表示变量是inout
。 我不相信你可以将变量声明为 inout
除非它被直接修改底层内存的函数使用,但我会让专家纠正我。相反,使用 withUnsafePointer
.
感谢 Martin 的帮助评论,此语法在 Swift 中从未有效,并且没有安全的方法来创建 "free pointers" 到 Swift 变量。