【问题标题】:private(set) with let properties - 'private(set)' modifier cannot be applied to read-only properties带有 let 属性的 private(set) - 'private(set)' 修饰符不能应用于只读属性
【发布时间】:2020-06-12 05:40:56
【问题描述】:

我已经知道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)' 修饰符不能应用于只读属性

由于nameage 不是只读属性,它不应该给出这样的错误。

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

【问题讨论】:

  • let 定义该属性可以初始化一次,然后永远不会更改,但set 定义该属性可以更改任何(多次)次。
  • let 上没有像 set 这样的东西。 let 只是 get。我希望你能得到。

标签: ios swift var access-modifiers let


【解决方案1】:

private(set) let 用词自相矛盾。任何 setter 都需要 variable。

请注意,为属性分配默认值并不是在初始化方面设置属性。由于这个原因,didSet 属性观察器在为属性分配默认值后不会被调用。

在 Swift 中只有 一个 使用private(set) 的情况:如果类包含修改变量的代码

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 提供显式常量,具有更高的安全性、更少的内存使用和更好的性能。

【讨论】:

    【解决方案2】:

    Let 是常量......你不能改变你分配给它们的值。这就是为什么它们被认为是只读的......所以错误是有效的......如果你想在为它们分配任何值后设置它们,要么将它们转换为 var,要么删除 private(set) 并将它们设为私有

    快乐编码 =)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        当它是 let 常量时,您不需要私有 setter。 只需在构造函数中或与声明在同一行初始化它即可。

        如果要在构造函数之外更改它,则需要将其设为var

        【讨论】:

          【解决方案5】:

          来自 Getters 和 Setters 下的 Swift.org

          您可以为 setter 赋予低于其对应权限的访问级别 getter,限制该 变量、属性的读写范围, 或下标。您通过写入分配较低的访问级别 var 之前的 fileprivate(set)、private(set) 或 internal(set) 或 下标介绍人.

          相关帖子:Swift: What does this error: 'private(set)' modifier cannot be applied to read-only properties mean?

          【讨论】:

            猜你喜欢
            • 2018-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-25
            • 1970-01-01
            • 2014-05-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多