Swift中的关键字inout允许函数直接修改传递参数的值(通过引用),而不是操作其副本。这类似于某些其他语言中的引用传递。
示例:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // 现在x == 11
var),不能传递let。问题: 如果结构作为另一个对象的一部分时,可以将结构的属性传递给带有inout参数的函数吗?
答案: 不能,因为Swift禁止在同一条指令中对同一属性的同时访问(Exclusive Access to Memory),以避免竞争条件和不确定行为。示例:
struct Point { var x: Int var y: Int } var p = Point(x: 1, y: 2) increment(&p.x) // ok increment(&p.y) // ok // increment(&p.x, &p.x) // 将导致错误
故事
在一个项目中,开发人员试图将同一个变量同时传递给两个带inout修饰符的函数参数,导致编译错误。这迫使他们重新考虑函数的架构,将更改分为两个步骤。
故事
实现者通过inout参数在循环中修改数组,导致了不可预见的结果,因为Swift在传递时会复制内容,而在循环之间的更改没有同步。
故事
开发人员期望inout参数总是“按引用”工作,但在处理类和结构时遇到了copy-in/copy-out语义,因此,如果嵌套结构对象发生更改,则并非所有更改都会被保存。