2015-09-16 5 views
6

Swiftで変数や関数を保護する(ルビーのように)方法を教えてください。スウィフトは3つのレベルしか持っていませんが、それでも可能ですか?Swiftの保護されたアクセスレベル

アクセスレベル

スウィフトは、あなたの コード内のエンティティのための3つの異なるアクセスレベルを提供します。これらのアクセスレベルは、 エンティティが定義されているソースファイル、およびソースファイル が属するモジュールに関連しています。

  • パブリックアクセスは実体が その定義モジュールから任意のソースファイル内で使用され、また定義しているモジュールをインポートし、別のモジュール からソースファイルにすることができます。 がフレームワークへのパブリックインターフェイスを指定するときは、一般的にパブリックアクセスを使用します。
  • 内部アクセス は、定義している モジュールのソースファイル内でエンティティを使用できますが、そのモジュール外のソースファイルでは使用できません。 は、通常、アプリケーションまたはフレームワークの内部構造を定義するときに内部アクセスを使用します。
  • プライベートアクセスでは、エンティティの使用を独自の定義元ファイル に制限します。専用アクセスを使用して、特定の機能の実装の詳細を表示しないようにします。

公開 アクセスが最高(最低制限)アクセスレベルで、民間 アクセスは最下位(最も制限)であるアクセスレベル

現在、私は唯一の解決策を参照してください - プライベートで親クラスを書きます修飾子と子クラスが1つのファイルに含まれていますが、それは痛いものです。

+1

これの根拠を説明するSwift Blogエントリがありました。もうAppleのウェブサイトには載っていないようですが、ここでも読むことができます:http://web.archive.org/web/20150810115840/https://developer.apple.com/swift/blog/?id=11 。 –

+0

@MartinR Apple Swiftのブログにはまだあります。私の答えは – onmyway133

答えて

3

ルビーの視点では、重要なことがあります。しかし、スイフトでは、どちらも役に立たず、言語の問題でもありません。

スウィフト言語は、主にアクセスレベルに関してモジュールに基づいています。それにはpublic private(set)という変数もあります。これはObjective-C(ボイラープレートを引き起こす)に必要な変数です。

3

Swiftにはprotectedと同等のものはなく、サブクラスのみがメソッドにアクセスできます。個人的に、私はそれを見逃すことはありません。

スウィフト(Objective-C)では、サブクラス化に他の言語よりもはるかに重視されていません。あなたが保護したいメソッドのセットを見つけたら、それらをデリゲートとして取り除く方が良いでしょう。

+1

ですので、親と子は秘密裏に通信できませんか? – Arsen

+0

@Arsen「秘密に」とはどういう意味ですか? – JeremyP

4

スウィフトは使用しないでください。protectedあなたはについて推論する全く新しい制御軸を追加し、継承してアクセスを融合します保護され、これとは対照的に、ここでAccess Control and protected

の理由を読むことができます。サブクラスは新しいパブリックメソッドまたはプロパティを通じて常に「保護された」APIを公開できるため、実際には実際の保護は提供されません。新しいオーバーライドはどこからでも来る可能性があるため、最適化の機会は増えません。そして、それは不必要に制限的です。サブクラスは何かにアクセスすることができますが、サブクラスのヘルパーはアクセスできません。

1

スウィフト3.0は保護された修飾語を持つことができません。私たちのSDKでは、sdkプロジェクトでのみset操作を承認するinternal(set)修飾子を使用します。

private var _authorized : Bool = false 
public internal(set) var authorized : Bool 
{ 
    get 
    { 
     return _authorized; 
    } 
    set 
    { 
     _authorized = newValue 
    } 
} 
関連する問題