【问题标题】:Swift: Struct Array vs Class ArraySwift:结构数组与类数组
【发布时间】:2022-06-17 05:18:11
【问题描述】:

我有一个 swift 结构数组,但我无法编辑第一个属性,而我可以使用类数组编辑第一个属性。

为了编辑结构数组的第一个对象,我必须先做[0] 然后.first

我知道结构是按类型计算的,类是按引用计算的。但我不明白不同的行为。谁能解释一下?

class PersonObj {
    var name = "Dheearj"

}

struct Person  {
    var name = "Dheearj"
    
    mutating func update(name: String){
        self.name = name
    }
}

var array = [Person(),Person()]
array[0].update(name:"dheeraj")
array[0].name = "yuuu"
array.first?.name = "dddddd" <--- "Error Here"

var array1 = [PersonObj(),PersonObj()]
array1.first!.name = "ttt"

print(array1.first?.name ?? "")
print(array.first?.name ?? "")
print(array.count)

错误信息截图:

【问题讨论】:

    标签: ios arrays swift class


    【解决方案1】:

    改变存储在其他属性中的结构的行为就像您复制了值,修改了它,然后将其覆盖回原处。

    以这一行为例:(为简单起见,我将可选链接替换为强制展开)

    array.first!.name = "dddddd"
    

    它的行为就像你做的那样:

    var tmp = array.first!
    tmp.name = "dddddd"
    array.first = tmp
    

    很容易看出什么不起作用。 Array.first,是一个 get-only 属性(它没有 setter)。

    类的情况是有效的,因为存储在数组中的值是对对象的引用,并且引用没有改变(只有它所引用的对象中的值,数组不知道或不关心)。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2021-03-20
      相关资源
      最近更新 更多