为什么forEach中的迭代器对于一个结构是不可变的,但对于一个类是可变的?

时间:2016-07-14 05:20:44

标签: swift class struct foreach iterator

迭代器对于类是可变的:

var selections: [Selection] = []

class Selection {
    var selected: Bool

    init(selected: Bool) {
        self.selected = selected
    }
}

selections.forEach({ $0.selected = false }) // This works

但结构不可变:

var selections: [Selection] = []

struct Selection {
    var selected: Bool
}

selections.forEach({ $0.selected = false }) // This doesn't work because $0 is immutable

1 个答案:

答案 0 :(得分:2)

事实并非如此,结构是不可改变的。但是你改变了结构的不同实例。

Swift模糊了对象和结构的处理方式。

对象是引用类型,结构是值类型。这意味着,迭代对象会将对象的引用作为参数传递,并更改引用所指向的对象,从而更改原始对象。

结构是价值类型。结构的新实例作为参数传递。而且在这种情况下它是恒定的。但即使你可以改变它,这也不会影响结构的原始实例。

在其他编程语言中,这种不同的间接层是可见的,即。即在Objective-C中*。在Swift中它不是。