web-dev-qa-db-ja.com

インスタンスプロパティをサブクラスのみに表示する方法swift

インスタンスプロパティをSwiftで宣言しようとしています。そのため、クラスとサブクラスにのみ表示されます。これは他の言語では保護されたプロパティと呼ばれます。 Swiftでこれを達成する方法は?

35
nwales

継承ラインに沿ったアクセス制御は、SwiftおよびCocoaの背後にある設計哲学に実際には適合しません。

Swiftでアクセス制御レベルを設計するとき、2つの主なユースケースを考慮しました。

  • クラスのprivate詳細をアプリの残りの部分から隠しておきます
  • フレームワークのinternal詳細をクライアントアプリから隠します

これらは、それぞれprivateおよびinternalアクセスレベルに対応しています。

対照的に、protectedはアクセスを継承で制限し、まったく新しい制御軸を追加します。サブクラスは常に、新しいパブリックメソッドまたはプロパティを介して「保護された」APIを公開できるため、実際の保護は提供されません。新しいオーバーライドはどこからでも来る可能性があるため、追加の最適化の機会も提供しません。また、不必要に制限されています。サブクラスはヘルパーにアクセスできますが、サブクラスにはアクセスできません。

詳細な説明があります AppleのSwiftブログ で。

38
rickster

そのための1つの方法は、fileprivateキーワードを使用して関数またはプロパティを定義し、同じファイルでサブクラスを次のように定義することです。

class Parent {
    fileprivate var someProperty: Any?
}

class Child: Parent {
    func someFunction() {
        print(someProperty)
    }
}

もちろん、このファイルは非常に混乱するため、これは非常に迷惑です。理由は言うまでもありませんSwiftはこれを許可しますが、protectedは許可しません... argh。

8
funct7