Swift只读外部读写内部属性

在Swift中,定义常见模式的常规方法是什么?在这种模式下,属性是从外部读取的,但在拥有它的类(和子类)内部可以修改。

在Objective-C中,有以下选项:

  • 在接口中声明该属性为只读属性,并使用类扩展来在内部访问该属性。 这是基于消息的访问,因此它与KVO,primefaces性等很好地配合
  • 在界面中声明属性只读,但在内部访问后援伊娃。 因为ivar的默认访问是受保护的,所以这在类层次结构中很好地起作用,其中子类也将能够修改该值,但是该字段是以其它方式只读的。

在Java中,惯例是:

  • 声明一个受保护的字段,并实现一个公共的,只读的getter(方法)。

Swift的成语是什么?

给定一个类属性,你可以指定一个不同的访问级别,通过在属性声明前加上访问修饰符,然后在括号之间进行getset 。 例如,具有公共getter和私有setter的类属性将被声明为:

 private(set) public var readonlyProperty: Int 

build议阅读: 吸气剂和固化剂

Martin对可访问性级别的考虑仍然有效,即没有protected修饰符, internal限制只访问模块,只对当前文件private ,对public没有任何限制。

Swift 3笔记

2个新的访问修饰符,文件fileprivateopen已被添加到语言,而privatepublic已经稍微修改:

  • 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