2

根据 Swift Programming Language Guide (for Swift 4.2) 中的“内存安全”一章,有一句话“A function has long-term write access to all its in-out parameters”。 https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html

我创建了一个新的命令行工具项目来在 Xcode 10.1 中验证它。

var stepSize = 1

func increment(_ number: inout Int) {
  print(stepSize)
}

increment(&stepSize)

我希望输出为 1,但实际输出是崩溃日志“同时访问 0x100587430,但修改需要独占访问”。

我知道这是关于访问输入输出参数的冲突,但我不知道为什么会这样。为什么一个函数对其所有输入输出参数都有长期写入权限?

4

1 回答 1

2

此 API 的使用者看到func increment(_ number: inout Int),但看不到实现。它只能假设increment(_:)对参数进行写入,因为原则上它可以

即使函数实现当前没有进行任何写入,也存在这种可能性,因此编译器必须假设最坏的情况。想象一下,如果允许某些客户端代码对此进行编译,则将其视为只读(因为当时可能是这种情况)。当有人添加number += 1到函数体时,客户端代码应该发生什么?

这类似于拥有一个声明它的函数 can throw,其实际实现却没有throw。编译器仍然将其视为抛出,并且需要使用try.

于 2019-01-28T03:23:29.487 回答