如果有类
被定义为结构体,则此示例Swift代码不会编译。编译器说:@value$T6与(String, Proto)
不相同
但是,编译器不会抱怨有类
。
为什么?
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 } }
因为您在store函数中修改了struct的元素,如果这样做,您必须为其添加“mutating”前缀。所以:
public mutating func store (key:String, value:Proto) {
map[key] = value // That does not work if SomeClass is a struct
}
结构体和枚举是值类型。默认情况下,不能从其实例方法中修改值类型的属性。
但是,如果您需要在特定方法中修改结构或枚举的属性,您可以选择对该方法的行为进行突变。