Swift只读外部读写内部属性
在Swift中,定义常见模式的常规方法是什么?在这种模式下,属性是从外部读取的,但在拥有它的类(和子类)内部可以修改。
在Objective-C中,有以下选项:
- 在接口中声明该属性为只读属性,并使用类扩展来在内部访问该属性。 这是基于消息的访问,因此它与KVO,primefaces性等很好地配合
- 在界面中声明属性只读,但在内部访问后援伊娃。 因为ivar的默认访问是受保护的,所以这在类层次结构中很好地起作用,其中子类也将能够修改该值,但是该字段是以其它方式只读的。
在Java中,惯例是:
- 声明一个受保护的字段,并实现一个公共的,只读的getter(方法)。
Swift的成语是什么?
给定一个类属性,你可以指定一个不同的访问级别,通过在属性声明前加上访问修饰符,然后在括号之间进行get
或set
。 例如,具有公共getter和私有setter的类属性将被声明为:
private(set) public var readonlyProperty: Int
build议阅读: 吸气剂和固化剂
Martin对可访问性级别的考虑仍然有效,即没有protected
修饰符, internal
限制只访问模块,只对当前文件private
,对public
没有任何限制。
Swift 3笔记
2个新的访问修饰符,文件fileprivate
和open
已被添加到语言,而private
和public
已经稍微修改:
-
open
仅适用于类和类成员:它用于允许类被子类化,或者在成员被定义的模块之外重写成员。 而是public
让公众可以访问该类或该成员,但不能inheritance或覆盖 -
private
现在使得一个成员只能从封闭的声明中可见和可访问,而fileprivate
则是包含它的整个文件
更多细节在这里 。
根据@Antonio,我们可以使用一个单独的属性作为readOnly
属性值进行公开的readWrite
和私人的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