2017-04-07 12 views
2

私はfileprivateアクセスレベル修飾子は、それが宣言されたソースファイルに関数/プロパティーを使用して制限し、private - 宣言されたレキシカルスコープに限定されていることを知っています。しかし、このルールは拡張機能には適用されないようです。例えば。このコードは有効です:fileprivateとprivate拡張の違いは?

class Foo { 
} 

fileprivate extension Foo { 
    var aa: Int { 
     return aaa + 10 
    } 
} 

private extension Foo { 
    var aaa: Int { 
     return 20 
    } 
} 

私はそれらの違いを理解してくれましたか?ありがとう。

+0

延長の範囲がファイルされているので、それはだ場合うーん...私は疑問に思いますか? varsを拡張子の代わりにfileprivateおよびprivateとして宣言した場合、これは機能しません。 – Fogmeister

+0

@Fogmeisterそうです、変数にアクセス修飾子を追加すると、これは機能しません。おそらくAppleはそれをしました。私的な拡張が意味をなさないので、私は私的な拡張で宣言されたすべてがそこにしか見えないことを意味します。 –

+0

関連:http://stackoverflow.com/questions/39739813/private-vs-fileprivate-on-declaring-global-variables-consts-in-swift3、http://stackoverflow.com/questions/43054774/distinction-between -private-and-fileprivate-top-level-classes。 –

答えて

1

タイプのメンバーについて話しているときに違いが出てくるだけです。 privateは同じタイプ定義内の他のメソッドへのアクセスを制限しますが、同じ.swiftファイル内にあるものはfileprivateにアクセスできます。

トップレベル(型定義の外)に住んでいるもののために

privatefileprivateまったく同じことを行います。あなたは

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
} 

private extension Foo 
{ 
    var aaa: Int 
    { 
     return 20 
    } 
} 

を書くときあなたは本当に最終的には、同じプロトコル上の2つの拡張は、単一の拡張にコンパイラによって解決を取得

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
} 

fileprivate extension Foo 
{ 
    var aaa: Int 
    { 
     return 20 
    } 
} 

を書きました。

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
    var aaa: Int 
    { 
     return 20 
    } 
} 

あなたはこのような二つのキーワードを持つことが、いくつかのスウィフト建築家agree with youretardedだと思うと思われる場合。私はいくつかのスタイルガイドでは、publicprivateのアクセス修飾子(そして修飾子はinternalですが、デフォルトはこれがデフォルトです)を使用することをお勧めします。これは、一般的には、ファイルごとに制限するためです。 -moduleまたはper-typeベースは特に有用ではありません。

fileprivate修飾子を使用する必要がある場合は、private修飾子をタイプスコープの外部で使用しないでください。それは混乱します(その文脈ではprivateは実際にはfileprivateを意味します)、コードを読みにくくします。

+0

あなたが意味することを理解しているかわかりません。「タイプメンバーについて話しているときに違いが出てくるだけです。また、実際の質問にどのように対処したかわからない場合は、別のシナリオを表示しませんでしたか? – Honey

+0

@Honey拡張は型メンバーではなく、トップレベルで宣言されています。そのため、 'private'修飾子は本当に' fileprivate'修飾子の綴りが異なるのです。 –

0

スウィフト4.0では、範囲がprivateおよびfileprivateと拡張されています。
プライベートは、実際のクラス/エクステンションの外で同じファイル内でアクセスできるようになりました。あなたが/他のファイルで、あなたの拡張子を定義する宣言する場合は、あなたのプライベート変数は、その時間fileprivateにアクセスすることはできません


を動作するファイルプライベート
ファイル・プライベートアクセスは、エンティティの使用を制限独自のソースファイルを定義します。これらの詳細がファイル全体で使用されている場合、特定の機能の実装の詳細を非表示にするには、ファイルプライベートアクセスを使用します。
構文:fileprivate <var type> <variable name>
例:fileprivate class SomeFilePrivateClass {}


プライベート
専用アクセスが囲んで宣言に、同じであること宣言の拡張にエンティティの使用を制限しますファイル。これらの詳細が単一の宣言内でのみ使用される場合、特定の機能の実装の詳細を非表示にするには、プライベートアクセスを使用します。
構文:private <var type> <variable name>
例:ここではprivate class SomePrivateClass {}


は、すべてのアクセスレベルの詳細です:Swift - Access Levels

関連する問題