所以,我最近在 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:'
有人可以帮我纠正这些吗?
答案 0 :(得分:1)
正如其他人所说,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, 7, 10], [6, 5, 5], [8, 5, 5]]
这是我对该函数的期望。
我做了更多的挖掘,参数上的 var
限定符不允许您将更改后的值返回给调用者。正如所写的那样,该函数修改了传递给它的 image
数组的本地副本,然后当函数返回时,这些更改将被丢弃。我看不出这段代码的意义所在。