在其下标getter中改变结构

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属性时,为什么一个工作,而另一个工作?

Mar*_*n R 5

您的

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)