我要遵守协议,并隐藏要访问的一致属性(将其声明为private
)。
请考虑以下内容:
protocol P {
var value: String { get }
init(value: String)
}
class C: P {
var value: String
required init(value: String) {
self.value = value
}
}
我将创建一个C
对象:
let myObject = C(value: "Hello World")
myObject.value = "New Value"
基于此,我有两个问题:
现在,如果我尝试将value
声明为私有:
private var value: String { get }
编译器将抛出错误:
“专用”修饰符不能在协议中使用
提出了将private
替换为internal
的修复建议。
如何通过说value
来阻止myObject.value
的访问?如果没有办法,此限制的原因是什么?
答案 0 :(得分:2)
符合
protocol P {
var value: String { get }
init(value: String)
}
需要具有默认访问权限的gettable属性value
。如果写访问
符合类别的属性应仅限于类别本身
那么您可以在Swift readonly external, readwrite internal property中声明它:
class C: P {
private(set) var value: String
required init(value: String) {
self.value = value
}
}
let myObject = C(value: "Hello World")
print(myObject.value) // OK
myObject.value = "New Value" // Error: Cannot assign to property: 'value' setter is inaccessible
如果该属性仅应在初始化程序中设置,则进行设置 常量:
class C: P {
let value: String
required init(value: String) {
self.value = value
}
}
let myObject = C(value: "Hello World")
print(myObject.value) // OK
myObject.value = "New Value" // Error: Cannot assign to property: 'value' is a 'let' constant