Meh*_*mar 1 syntax struct swift
在玩结构时,我发现了以下内容:
struct SomeStruct {
private(set) var uncount: Int
subscript(i: Int) -> Int {
uncount = i // <--'self' is immutable-----
return 3
}
}
let someStructInstance = SomeStruct(uncount: 3)
someStructInstance[345]
Run Code Online (Sandbox Code Playgroud)
上面的代码没有编译,因为'self是不可变的',你不能在下标中添加mutating关键字.
但是,以下工作完美:
struct SomeStruct {
private(set) var uncount: Int
subscript(i: Int) -> Int {
get {
return 3
}
set {
uncount = i //<--works well now---
}
}
}
let someStructInstance = SomeStruct(uncount: 3)
someStructInstance[345]
Run Code Online (Sandbox Code Playgroud)
问题:当下标函数都改变了struct属性时,为什么一个工作,而另一个工作?
您的
subscript(i: Int) -> Int {
uncount = i // <--'self' is immutable-----
return 3
}
Run Code Online (Sandbox Code Playgroud)
只定义了一个下标吸气剂,那就是非不同诱变默认.
如果你真的需要在getter中改变属性,那么你可以将它声明为mutating get:
subscript(i: Int) -> Int {
mutating get {
uncount = i
return 3
}
}
Run Code Online (Sandbox Code Playgroud)
因此,吸气剂不能再用于恒定值,
let someStructInstance = SomeStruct(uncount: 3)
print(someStructInstance[345])
// error: Cannot use mutating getter on immutable value: 'someStructInstance' is a 'let'
Run Code Online (Sandbox Code Playgroud)
它必须是一个变量:
var someStructInstance = SomeStruct(uncount: 3)
print(someStructInstance[345]) // 3
print(someStructInstance.uncount) // 345
Run Code Online (Sandbox Code Playgroud)