有人可以向我解释一下我在这里想念的东西吗?
给予
let index: Int32 = 100
为什么这样不好?
// Use of extraneous '&'
let ptr = &index // Type inference?
甚至:
// Use of extraneous '&'
let ptr: UnsafePointer<Int32> = &index
但这是:
{
func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
}
这与C语言中的等效:
int index = 100;
int *ptr = &index;
我真的必须定义一个从字面上接受引用值并传回相同引用的函数吗?感觉有些不对劲。似乎我在这里缺少某些东西,甚至可能是根本的东西。
如何将UnsafePointer分配给其类型的内存地址(在这种情况下为Int32)?
谢谢!
编辑:
最终,我要完成的工作是,我需要将几种不同的结构写入二进制文件。变量index
将是结构的属性。我现在要走的路径涉及一个文件OutputStream
。我不介意对此提出建议,但超出了原始问题的范围。
答案 0 :(得分:4)
我不知道确切的理由,但是大概let ptr = &index
是不允许的,因为不能保证您可以在不调用 undefined behaviour 的情况下取消引用ptr
(假设{ {1}}不是全局变量或index
存储变量,这是Swift保证稳定且唯一的指针值的唯一情况。
与其他语言不同,Swift不能保证局部变量将一直保持初始化状态,直到在其声明的作用域末尾为止-优化器可以自由地对其进行初始化。因此,允许static
将使编写不正确的代码变得非常容易。
值得注意的是您的示例:
let ptr = &index
也是不完美的。尝试从func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
return num
}
let ptr = point(num: &index)
解除对ptr
的引用是未定义的行为,因为inout-to-pointer参数转换会生成一个仅在函数调用期间有效的临时指针。
如果要使用作用域的临时指针指向某个值,则可以使用withUnsafePointer(to:)
–例如:
let ptr = point(num: &index)
请注意,该指针仅在关闭期间有效-尝试对其进行转义将导致不确定的行为。