首页 > 解决方案 > Swift 中的 inout 参数

问题描述

在尝试研究 ionut 参数时,我遇到了一个 代码示例。

此代码引发错误:

“执行被中断,原因:信号 SIGABRT。进程已留在中断点,使用“线程返回 -x”返回表达式评估之前的状态。”

但是,当尝试对实际项目进行 debag 时,po char 1。

var num1: Int = 1
var char1 = "a"

func changeNumber(num: Int) {
    var num = num
    num = 2
    print(num) // 2
    print(num1) // 1
}
changeNumber(num: num1)

func changeChar(char: inout String) {
    char = "b"
    print(char) // b
    print(char1) // b
}
changeChar(char: &char1)

请解释为什么会出现此错误以及如何解决?

标签: swift

解决方案


错误应该在堆栈跟踪的顶部:

Simultaneous accesses to 0x109fac098, but modification requires exclusive access.

当您char1作为inout参数传递给它时,在该函数返回之前,以任何其他方式changeChar访问都会违反内存。char1

有关详细信息,请参阅SE-176 Enforce Exclusive Access to Memory,它在 Swift 4 中添加了此限制。


推荐阅读