インスタンスプロパティをSwiftで宣言しようとしています。そのため、クラスとサブクラスにのみ表示されます。これは他の言語では保護されたプロパティと呼ばれます。 Swiftでこれを達成する方法は?
継承ラインに沿ったアクセス制御は、SwiftおよびCocoaの背後にある設計哲学に実際には適合しません。
Swiftでアクセス制御レベルを設計するとき、2つの主なユースケースを考慮しました。
- クラスの
private
詳細をアプリの残りの部分から隠しておきます- フレームワークの
internal
詳細をクライアントアプリから隠しますこれらは、それぞれ
private
およびinternal
アクセスレベルに対応しています。対照的に、
protected
はアクセスを継承で制限し、まったく新しい制御軸を追加します。サブクラスは常に、新しいパブリックメソッドまたはプロパティを介して「保護された」APIを公開できるため、実際の保護は提供されません。新しいオーバーライドはどこからでも来る可能性があるため、追加の最適化の機会も提供しません。また、不必要に制限されています。サブクラスはヘルパーにアクセスできますが、サブクラスにはアクセスできません。
詳細な説明があります AppleのSwiftブログ で。
そのための1つの方法は、fileprivate
キーワードを使用して関数またはプロパティを定義し、同じファイルでサブクラスを次のように定義することです。
class Parent {
fileprivate var someProperty: Any?
}
class Child: Parent {
func someFunction() {
print(someProperty)
}
}
もちろん、このファイルは非常に混乱するため、これは非常に迷惑です。理由は言うまでもありませんSwiftはこれを許可しますが、protected
は許可しません... argh。