swift - 在其下标 getter 中改变结构

标签 swift struct syntax

在玩结构体时,我发现了以下内容:

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]

上面的代码无法编译,因为'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]

问题:当两个下标函数都改变 struct 属性时,为什么一个起作用,而另一个不起作用?

最佳答案

你的

subscript(i: Int) -> Int {
    uncount = i  // <--'self' is immutable-----
    return 3
}

仅定义一个下标 getter, 并且默认情况下不可变

如果你真的需要改变 getter 中的属性,那么 您可以将其声明为 mutating get:

subscript(i: Int) -> Int {
    mutating get {
        uncount = i
        return 3
    }
}

因此,getter 不能与常量一起使用 不再,

let someStructInstance = SomeStruct(uncount: 3)
print(someStructInstance[345])
// error: Cannot use mutating getter on immutable value: 'someStructInstance' is a 'let'

它必须是一个变量:

var someStructInstance = SomeStruct(uncount: 3)
print(someStructInstance[345])     // 3
print(someStructInstance.uncount)  // 345

关于swift - 在其下标 getter 中改变结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48359634/

相关文章:

ios - 为什么我的图像没有附加到数组中?

swift - 从父节点 Swift 2 中删除子节点

c++ - 调整大型结构 vector 大小时的段错误

C++ - 结构需要访问类的私有(private)实例变量

java - 使用图形的语法错误

php - do-while 循环的替代语法(使用冒号)

swift - 如何处理鼠标输入: events on an NSView with rounded corners

swift - 如何正确安装 Alamofire SwiftyJSON 和 Alamofire-SwiftyJson

将结构复制到另一个

function - Rust:具有相同名称的结构和函数