【问题标题】:Obsolete Swift code won't run on Xcode 12过时的 Swift 代码无法在 Xcode 12 上运行
【发布时间】:2021-08-01 21:29:53
【问题描述】:

所以,我最近在 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' is a 'let' constant

raiseLowerValuesOfImage(image) 返回错误Missing argument label 'var:' in call

谁能帮我改正这些?

【问题讨论】:

  • "'var' 在这个位置被解释为一个参数标签" 用_替换var
  • “不能通过下标赋值:'image' 是一个 'let' 常量”这甚至不像 Swift,你知道这门课是什么时候写的吗?但无论如何,只需删除该行
  • “所以,我最近在 Coursera 上为初学者开设了 Swift 课程,但他们使用的 Xcode 版本是旧版本”所以停止该课程。对你没用。
  • 马特的观点很好。基于早于 Swift 3 的 Swift 版本的课程将给你带来更多的困惑,而不是它的价值。从 Swift 2 到 Swift 3 发生了巨大的转变。从版本 3 开始,这些变化更加渐进。我现在不会花时间学习 Swift 1 或 2。
  • 鉴于事情变化如此之快,我建议查找基于 Swift 5 的课程。

标签: swift


【解决方案1】:

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

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

在最新版本的 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 参数的函数,您需要传递标有&amp; 符号的参数,该符号告诉编译器“通过引用”传递参数。您可以使用如下代码在数组上运行该函数:

raiseLowerValuesOfImage(&image)
print(image)

输出

[[5, 7, 10], [6, 5, 5], [8, 5, 5]]

这是我对该功能的期望。

编辑:

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

【讨论】:

  • 我认为这正是他们摆脱 var 参数的原因。它使得参数如何传递给函数看起来有些特别,但实际上并没有。效果纯粹是内部的。所以现在,var 声明也是如此。 — 另外:“在最新版本的 Swift 中,您告诉编译器您希望能够修改传递给您的参数并通过将参数标记为 inout 来返回修改后的值”不,inout 不是最近的。它在 Swift 1 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2021-08-29
相关资源
最近更新 更多