Swift readonly外部,readwrite内部属性

时间:2014-09-07 08:37:35

标签: objective-c properties swift

在Swift中,定义公共模式的常规方法是什么,其中属性是外部只读的,但是在拥有它的类(和子类)内部可以修改。

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

  • 在接口中将该属性声明为readonly,并使用类扩展在内部访问该属性。这是基于消息的访问,因此它可以很好地与KVO,原子性等一起使用。
  • 在接口中将属性声明为只读,但在内部访问支持ivar。由于ivar的默认访问受到保护,因此在类层次结构中可以很好地工作,其中子类也可以修改该值,但该字段是readonly。

在Java中,惯例是:

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

Swift的成语是什么?

2 个答案:

答案 0 :(得分:202)

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

private(set) public var readonlyProperty: Int

建议阅读:Getters and Setters

Martin对无障碍级别的考虑仍然有效 - 即没有protected修饰符,internal仅限制对模块的访问,private为当前仅限文件,public没有任何限制。

Swift 3音符

该语言已添加了2个新的访问修饰符fileprivateopen,而privatepublic略有修改:

  • 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