2016-08-24 9 views
0

私はSwiftのアクセス制御修飾子について誤解しているようです。ここに遊び場からの私のコードは次のとおりです。他の言語から計算されたプロパティの迅速なアクセス制御:これはなぜ機能しますか?

class Something { 
    private (set) var name :String { 
    get { return "" } 
    set {} 
    } 
} 
var thing = Something(); 
thing.name = ""; 

私の勘と経験が、最後の行にコンパイルエラーがなければならないことを私に伝えます。

しかし私が学んでいる本では、プライベートとは、変更されているメンバーが同じソースファイルからのみアクセス可能であることを意味しています。

私はこのシナリオを一般的にはほとんどのプロジェクトでエラーになると思いますが、これは私がこのコードを遊び場で実行しているためです。

プライベートメンバーには、同じソースファイルからしかアクセスできないというステートメントは完全に正確ですか?

+6

* "プライベートメンバーは同じソースからしかアクセスできません" * Swift 2では完全に正確です - Swift 3(Xcode 8 beta 6)はプライベートの意味を変更しました[ swift3のfileprivateとprivateの間で](http://stackoverflow.com/questions/39027250/what-is-a-good-example-to-differentiate- between-fileprivate-and-private-in-swift)。 –

+0

@MartinRありがとう、答えとしてあなたのコメントを投稿し、私はそれを受け入れるでしょう。 –

+1

私は既存の答えを繰り返す必要はありません:)そして、実際にあなたの質問は私には不明です。あなたの最後の声明は正しいので、なぜそれについて疑問に思いますか? 「このシナリオは、通常、ほとんどのプロジェクトでエラーになるでしょう」という意味はどうですか? –

答えて

2

このルールはSwift 2のすべてのバージョンで有効です。あなたの例でも有効ですが、セッターが呼び出された同じファイル(あなたの例がわかっていれば)にセッターコードが含まれています。

トップレベルの割り当て式thing.name = "";は、プレイグラウンドで実行されているため許可されています。プレイグラウンド外では、この特定の最上位レベルの割り当ては、のほとんどの場合例外です!)で違法になります。


"トップレベルコード"となるものとそれが該当する場合のボーナス説明。公式ブログスウィフトhereから:

しかし、トップレベルのコードが ファイルあなたスウィフトソースのほとんどで許可されていません。わかりやすくするために、 関数本体内、クラス内、またはその他の方法でカプセル化されていない実行可能ステートメントは、 トップレベルとみなされます。最高レベルのコードが すべてのファイルに許可されている場合は、 プログラムの開始場所を特定することが難しいため、このルールが適用されます。

...

あなたは以前、我々はトップレベルのコードは、アプリケーションのソースファイルのほとんど で許可されていないと述べたことに気づくでしょう。例外は "main.swift"という特別なファイルです。これは遊び場ファイルとよく似ていますが、アプリのソースコードには が組み込まれています。 "メイン。swift "ファイルには の最上位コードが含まれていてもよく、その順序に依存するルールも適用されます。 エフェクトでは、 "main.swift"で実行するコードの最初の行は暗黙的に がプログラムのメインエントリポイントとして定義されています。これにより、 "main.swift"にある限り、最小Swiftプログラムを1行にすることができます。

+0

@MartinR:そうです。私は私の答えを更新しました、うまくいけば、この編集で十分です。 –

1

しかし私が学んでいる本では、プライベートは、変更されているメンバーは同じソースファイルのにしかアクセスできないことを意味しています。

あなたの例は、同じソースファイルからアクセスしています。問題は何ですか?

スウィフト3では、privatefileprivateになります。アクセスは同じファイルのどこからでも許可されます。 Swift 3のprivateは期待通りの動作をしますが、アクセスはクラス/ struct/enum自体でのみ許可されています。

関連する問題