在Swift中,定义公共模式的常规方法是什么,其中属性是外部只读的,但是在拥有它的类(和子类)内部可以修改。
在Objective-C中,有以下选项:
在Java中,惯例是:
Swift的成语是什么?
答案 0 :(得分:202)
给定一个类属性,您可以通过在属性声明前面添加访问修饰符,然后在括号之间加get
或set
来指定不同的访问级别。例如,具有公共getter和private setter的class属性将声明为:
private(set) public var readonlyProperty: Int
建议阅读:Getters and Setters
Martin对无障碍级别的考虑仍然有效 - 即没有protected
修饰符,internal
仅限制对模块的访问,private
为当前仅限文件,public
没有任何限制。
该语言已添加了2个新的访问修饰符fileprivate
和open
,而private
和public
略有修改:
open
仅适用于类和类成员:它用于允许类进行子类化,或者在定义它们的模块之外覆盖成员。 public
使该类或成员可公开访问,但不可继承或可覆盖
private
现在只允许一个成员可以从封闭声明中访问,而fileprivate
到包含它的整个文件
更多详情here。
答案 1 :(得分:1)
根据@Antonio,我们可以使用单个属性公开访问readOnly
属性值,私下访问readWrite
。以下是我的插图:
class MyClass {
private(set) public var publicReadOnly: Int = 10
//as below, we can modify the value within same class which is private access
func increment() {
publicReadOnly += 1
}
func decrement() {
publicReadOnly -= 1
}
}
let object = MyClass()
print("Initial valule: \(object.publicReadOnly)")
//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"
//object.publicReadOnly += 1
object.increment()
print("After increment method call: \(object.publicReadOnly)")
object.decrement()
print("After decrement method call: \(object.publicReadOnly)")
这是输出:
Initial valule: 10
After increment method call: 11
After decrement method call: 10