web-dev-qa-db-ja.com

Swift readonly external、readwrite internal property

Swiftでは、プロパティが外部で読み取り専用であるが、それを所有するクラス(およびサブクラス)によって内部で変更可能である共通パターンを定義する従来の方法は何ですか。

Objective-Cには、次のオプションがあります。

  • インターフェイスでプロパティを読み取り専用として宣言し、クラス拡張を使用してプロパティに内部的にアクセスします。これはメッセージベースのアクセスであるため、KVO、原子性などとうまく機能します。
  • インターフェイスでプロパティを読み取り専用として宣言しますが、内部でバッキングivarにアクセスします。 ivarのデフォルトアクセスは保護されているため、これはサブクラスも値を変更できるクラス階層でうまく機能しますが、フィールドは読み取り専用です。

Javaの規則は次のとおりです。

  • 保護フィールドを宣言し、読み取り専用のパブリックgetter(メソッド)を実装します。

Swiftのイディオムは何ですか?

96
Jasper Blues

@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
1
Santosh