过时的 Swift 代码无法在 Xcode 12 上运行

所以,我最近在 Coursera 上为初学者开设了 Swift 课程,但他们使用的 Xcode 版本是旧版本,这意味着并非他们的代码所做的一切仍然适用。例如,在以下代码中,我收到以下错误:

var image = [
    [3,7,10],[6,4,2],[8,5,2]
]

func raiseLowerValuesOfImage(var image: [[Int]]) {
    for row in 0..<image.count {
        for col in 0..<image[row].count {
            image[row][col]
            if(image[row][col] < 5) {
                image[row][col] = 5
            }
        }
    }
}

raiseLowerValuesOfImage(image)

参考行 func raiseLowerValuesOfImage(var image:[[Int]]){ 我得到错误:'var' 在这个位置被解释为一个参数标签

image[row][col] = 5 给了我错误无法通过下标分配:'image' 是一个 'let' 常量

并且 raiseLowerValuesOfImage(image) 返回错误 在调用中缺少参数标签 'var:'

有人可以帮我纠正这些吗?

ergasfgsafg 回答:过时的 Swift 代码无法在 Xcode 12 上运行

正如其他人所说,Swift 很长时间不支持将函数参数声明为 vars。

我的猜测是这个程序应该修改传递给它的数组中的值。

在最新版本的 Swift 中,您告诉编译器您希望能够修改传递给您的参数并通过将参数标记为 inout 来返回修改后的值

重写您发布的代码以使用 inout:

var image = [
    [3,7,10],[6,4,2],[8,5,2]
]

func raiseLowerValuesOfImage(_ image: inout [[Int]]) {
    for row in 0..<image.count {
        for col in 0..<image[row].count {
//          image[row][col] // This line doesn't make sense. delete it.
            if(image[row][col] < 5) {
                image[row][col] = 5
            }
        }
    }
}

要调用带有 inout 参数的函数,请传递标有 & 符号的参数,该符号告诉编译器“按引用”传递参数。您可以使用如下代码在数组上运行该函数:

raiseLowerValuesOfImage(&image)
print(image)

输出

[[5,5],5]]

这是我对该函数的期望。

编辑:

我做了更多的挖掘,参数上的 var 限定符不允许您将更改后的值返回给调用者。正如所写的那样,该函数修改了传递给它的 image 数组的本地副本,然后当函数返回时,这些更改将被丢弃。我看不出这段代码的意义所在。

本文链接:https://www.f2er.com/467.html

大家都在问