【问题标题】:Swift Array optional Type and subscripting (Beta 3)Swift Array 可选类型和下标(Beta 3)
【发布时间】:2014-07-12 06:13:45
【问题描述】:

我正在关注 2014 WWDC 教程 408:使用 XCode Beta 3 的 Swift Playgrounds(30 分钟)。自 Beta 2 以来,Swift 语法发生了变化。

var data = [27, 46, 96, 79, 56, 85, 45, 34, 2, 57, 29, 66, 99, 65, 66, 40, 40, 58, 87, 64]

func exchange<T>(data: [T], i: Int, j: Int) {
    let temp = data[i]
    data[i] = data[j]  // Fails with error '@lvalue $T8' is not identical to 'T'
    data[j] = temp     // Fails with error '@lvalue $T5' is not identical to 'T'
}

exchange(data, 0 , 2)
data

为什么我不能以这种方式修改可变整数数组?

【问题讨论】:

    标签: arrays swift xcode6


    【解决方案1】:

    因为子程序参数是用let 隐式定义的,因此是不可变的。尝试将声明更改为:

    func exchange<T>(inout data: [T], i: Int, j: Int) {
    

    以及调用:

    exchange(&date, 0, 2)
    

    您也可以使用var,但这只会允许在子例程中修改数组。 beta 3 的重大变化是让数组真正按值传递,而不是在某些时候只是按值传递,但在其他时候则不然。

    【讨论】:

      【解决方案2】:

      @David 的回答是正确的,让我解释一下原因:数组(以及字典和字符串)是值类型(结构)而不是引用类型。当必须将值类型传递给函数时,会创建它的副本,并且函数在该副本上工作。

      通过使用inout 修饰符,原始数组被传递,因此在这种情况下可以对其进行更改。

      【讨论】:

      • 我有一个问题。例如,我有一个包含数组的对象。我通过 UIViewController 的属性传递这个对象。我应该怎么做才能将其作为参考传递?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2017-02-06
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多