具有 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
因为name
和age
不是只读属性,所以不应该出现这样的错误。
如果我使用 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 都需要 var
iable。
请注意,为 属性 分配默认值并不是 设置 初始化 属性。因此,在为 属性.
分配默认值后,不会调用 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 提供显式常量,具有更高的安全性、更少的内存使用和更好的性能。
我已经了解 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
因为name
和age
不是只读属性,所以不应该出现这样的错误。
如果我使用 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 都需要 var
iable。
请注意,为 属性 分配默认值并不是 设置 初始化 属性。因此,在为 属性.
分配默认值后,不会调用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 提供显式常量,具有更高的安全性、更少的内存使用和更好的性能。