快速只读外部,读写内部属性

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

In Objective-C, there are the following options:

  • 在接口中将该属性声明为只读,并使用类扩展在内部访问该属性。这是基于消息的访问,因此它与 KVO、原子性等工作得很好。
  • 在接口中将属性声明为只读,但是在内部访问备份 ivar。由于 ivar 的默认访问是受保护的,所以这在类层次结构中工作得很好,在类层次结构中,子类也能够修改值,但是字段在其他情况下是只读的。

在 Java 中,约定是:

  • Declare a protected field, and implement a public, read-only getter (method).

斯威夫特的成语是什么?

32763 次浏览

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

private(set) public var readonlyProperty: Int

建议读数: 引导者和引导者

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

斯威夫特三个音符

2 new access modifiers, fileprivate and open have been added to the language, while private and public have been slightly modified:

  • open仅适用于类和类成员: 它用于允许类被子类化或者成员在定义它们的模块之外被重写。相反,public使类或成员可公开访问,但不能继承或重写

  • private现在使一个成员可见,并且只能从封闭的声明访问,而 fileprivate只能访问包含它的整个文件

更多细节 给你

根据@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)")

And here is the output:

  Initial  valule: 10
After increment method call: 11
After decrement method call: 10