有没有办法将协议 属性 声明为私有的?
Is there a way to declare protocol property as private?
我想遵守一个协议,并隐藏其符合的属性以供访问(将它们声明为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"
基于此我有 2 个问题:
现在,如果我尝试将 value
声明为私有:
private var value: String { get }
编译器会抛出一个错误:
'private' modifier cannot be used in protocols
带有将 private
替换为 internal
的修复建议。
如何防止通过说 myObject.value
访问 value
?如果没有办法,这个限制的原因是什么?
符合
protocol P {
var value: String { get }
init(value: String)
}
需要具有默认访问权限的 gettable 属性 value
。如果对
符合 class 中的 属性 应限制为 class 本身
然后您可以将其声明为 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
我想遵守一个协议,并隐藏其符合的属性以供访问(将它们声明为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"
基于此我有 2 个问题:
现在,如果我尝试将 value
声明为私有:
private var value: String { get }
编译器会抛出一个错误:
'private' modifier cannot be used in protocols
带有将 private
替换为 internal
的修复建议。
如何防止通过说 myObject.value
访问 value
?如果没有办法,这个限制的原因是什么?
符合
protocol P {
var value: String { get }
init(value: String)
}
需要具有默认访问权限的 gettable 属性 value
。如果对
符合 class 中的 属性 应限制为 class 本身
然后您可以将其声明为 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