具有 let 属性的 private(set) - 'private(set)' 修饰符不能应用于只读属性

private(set) with let properties - 'private(set)' modifier cannot be applied to read-only properties

我已经了解 private(set) 的工作原理。但是下面的代码给出了编译时错误,

class Person {
    private(set) let name: String //Error.
    private(set) let age: Int //Error.

    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}

错误:

'private(set)' modifier cannot be applied to read-only properties

因为nameage不是只读属性,所以不应该出现这样的错误。

如果我使用 let 而不是 var,它工作正常。只是想知道为什么?

它们是只读的,因为你用 let 声明了它们,而不是 var

如果私有 setter 是 let 常量,则不需要。 只需在构造函数中或与声明在同一行中对其进行初始化即可。

如果你想在构造函数之外改变它,你需要把它变成var

假设是常量...您无法更改分配给它们的值。这就是为什么它们被认为是只读的……所以错误是有效的……如果你想在给它们赋值后设置它们,要么将它们转换为 var,要么删除 private(set) 并使它们只是 private

快乐编码=)

来自 Getters 和 Setters 下的 Swift.org

You can give a setter a lower access level than its corresponding getter, to restrict the read-write scope of that variable, property, or subscript. You assign a lower access level by writing fileprivate(set), private(set), or internal(set) before the var or subscript introducer.

相关post:

private(set) let 是自相矛盾的说法。任何 setter 都需要 variable。

请注意,为 属性 分配默认值并不是 设置 初始化 属性。因此,在为 属性.

分配默认值后,不会调用 didSet 属性 观察者

在Swift中只有一个案例可以使用private(set):如果class包含修改变量的代码

class Foo {
    let name : String
    private(set) var expiryDate : Date

    init(name: String, expiryDate: Date){
        self.name = name
        self.expiryDate = expiryDate
    }

    func extendExpiryDate(to newDate : Date) {
       expiryDate = newDate
    }
}

如果 属性 仅在 init 期间初始化,它是一个常量 - 正如其他答案中正确提到的那样 - 因此将其声明为 let 常量。与其他编程语言不同,Swift 提供显式常量,具有更高的安全性、更少的内存使用和更好的性能。