直接赋值UnsafePointer

Directly assign UnsafePointer

有人可以向我解释一下我在这里缺少什么吗?

给出

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。我不介意收到有关此的建议,但超出了原始问题的范围。

我不知道确切的理由,但大概 let ptr = &index 是不允许的,因为不能保证您可以取消引用 ptr 而不调用 未定义的行为(假设 index 不是全局变量或 static 存储变量——只有 Swift 保证稳定且唯一的指针值的情况)。

与其他语言不同,Swift 不保证局部变量在其声明的范围结束之前将保持初始化状态——优化器可以自由地提前取消初始化它。因此,允许 let ptr = &index 会使编写不合理的代码变得太容易了。

值得注意的是您的示例:

func point(num: UnsafePointer<Int32>) -> UnsafePointer<Int32> {
    return num
}
let ptr = point(num: &index)

也是不健全的。尝试从 let ptr = point(num: &index) 中取消引用 ptr 是未定义的行为,因为 inout 到指针参数转换会产生一个临时指针,仅在函数调用期间有效。

如果你想要一个 scoped 临时指针指向一个值,你可以使用 withUnsafePointer(to:) – 例如:

func baz() {
  var foo = 5
  withUnsafePointer(to: &foo) { ptr in
    // use `ptr` here – do not escape it!
  }

  // In Swift 4.2 you can also use `withUnsafePointer(to:)` on let constants.
  let bar = 5
  withUnsafePointer(to: bar) { ptr in
    // use `ptr` here – do not escape it!
  }
}

请注意,指针仅在闭包期间有效——试图将其转义将导致未定义的行为。