是否有方法将协议属性声明为私有



我希望遵守协议,并隐藏其要访问的一致属性(将它们声明为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 }

编译器将抛出一个错误:

"私有"修饰符不能在协议中使用

带有用internal替换private的修复建议。

如何通过说myObject.value来防止value被访问?如果没有办法,这种限制的原因是什么?

符合

protocol P {
var value: String { get }
init(value: String)
}

需要具有默认访问权限的可获取属性value。如果对一致性类中的属性应限于类本身然后您可以将其声明为Swift只读外部、读写内部属性:

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

如果该属性只应在初始值设定项中设置,则使其a常数:

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

最新更新