我试图了解 Swift 中指针的使用,特别是:Unsafe[Mutable]Pointer
and UnsafeRaw[Mutable]Pointer
。我对这个问题有几个问题。
Is UnsafePointer <T>
等于const T * Pointer
在 ?和UnsafeMutablePointer <T>
等于T * Pointer
in C?
有什么区别Unsafe[Mutable]Pointer
and 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>
等于const T * Pointer
在 ?和UnsafeMutablePointer <T>
等于T * Pointer
in C?
好吧,在 Swift 应用程序中使用桥接标头来查看 C 指针是如何桥接的:
const int *myInt;
int *myOtherInt;
桥梁到
var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
- 有什么区别
Unsafe[Mutable]Pointer
and UnsafeRaw[Mutable]Pointer
?
Swift 3 添加了一个不安全RawPointer API https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md来替换Unsafe[Mutable]Pointer<Void>
类型。 Swift 中不再允许不同类型的指针之间的转换。相反,API 提供了接口(.assumingMemoryBound(to:)
or .bindMemory(to:capacity:)
) 将内存绑定到类型。
对于问题3,&符号表示变量是inout
。 我不相信你可以将变量声明为inout
除非它被直接修改底层内存的函数使用,但我会让专家纠正我。相反,使用withUnsafePointer
.罢工>
感谢 Martin 的有用评论,这种语法在 Swift 中永远无效,并且没有安全的方法来创建指向 Swift 变量的“自由指针”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)