如果将SomeClass
定义为struct,则此示例Swift代码无法编译。编译器说:@value $T6 is not identical to (String, Proto)
但是,如果SomeClass
是一个类,编译器不会抱怨。
为什么呢?
public protocol Proto { func hello(value:Int) } public struct SomeClass { var map = [String:Proto]() public func store (key:String, value:Proto) { map[key] = value // That does not work if SomeClass is a struct } }
答案 0 :(得分:2)
因为你在store函数中修改了struct的元素,如果你这样做了,你必须添加" mutating"它的前缀。 所以:
public mutating func store (key:String, value:Proto) {
map[key] = value // That does not work if SomeClass is a struct
}
结构和枚举是值类型。默认情况下,无法在其实例方法中修改值类型的属性。
但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择改变该方法的行为。