在 Swift 中,定义通用模式的传统方法是什么,其中属性是外部只读的,但可以由拥有它的类(和子类)在内部修改。
在 Objective-C 中,有以下选项:
- 在接口(interface)中将属性声明为只读,并使用类扩展在内部访问该属性。这是基于消息的访问,因此它可以很好地与 KVO、原子性等配合使用。
- 在接口(interface)中将属性声明为只读,但在内部访问支持 ivar。由于 ivar 的默认访问受到保护,因此这在类层次结构中可以很好地工作,其中子类也可以修改该值,但该字段是只读的。
在 Java 中,约定是:
- 声明一个 protected 字段,并实现一个公共(public)的只读 getter(方法)。
Swift 的惯用语是什么?
最佳答案
对于给定的类属性,您可以通过在属性声明前添加访问修饰符作为前缀,后跟括号之间的 get
或 set
来指定不同的访问级别。例如,具有公共(public) getter 和私有(private) setter 的类属性将声明为:
private(set) public var readonlyProperty: Int
建议阅读:Getters and Setters
Martin 关于可访问性级别的考虑仍然有效 - 即没有 protected
修饰符,internal
仅限制对模块的访问,private
仅限于仅限当前文件,并且 public
没有任何限制。
Swift 3 注释
语言中添加了 2 个新的访问修饰符:fileprivate
和 open
,同时 private
和 public
稍作修改:
open
仅适用于类和类成员:它用于允许在定义类的模块之外对类进行子类化或对成员进行覆盖。public
相反,使类或成员可公开访问,但不可继承或重写
<private
现在使成员仅可从封闭声明中可见和访问,而fileprivate
则可使其包含在整个文件中
更多详情here .
关于objective-c - Swift 只读外部,可读写内部属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58031021/