1

Swift のアクセス制御修飾子について誤解しているようです。遊び場からの私のコードは次のとおりです。

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

私の直感と他の言語での経験から、最後の行にコンパイラ エラーがあるはずだとわかります。

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

このシナリオは、ほとんどのプロジェクトで一般的にエラーになると想定しても安全ですか?これは、このコードをプレイグラウンドで実行しているからにすぎませんか?

プライベート メンバーは同じソース ファイルからのみアクセスできるという記述は完全に正確ですか?

4

2 に答える 2

2

このルールは Swift 2 のすべてのバージョンに有効です。あなたの例にも有効であり、セッターコードが同じファイルにあるため (私があなたの例を正しく理解している場合)、セッターが呼び出されたために機能しました。

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


「トップレベル コード」とは何か、およびそれがどこに適用されるかについてのボーナス説明。ここの公式Swiftブログから:

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

...

アプリのほとんどのソース ファイルではトップレベル コードを使用できないと前述しました。例外は、「main.swift」という名前の特別なファイルです。このファイルはプレイグラウンド ファイルと同じように動作しますが、アプリのソース コードでビルドされます。「main.swift」ファイルにはトップレベルのコードを含めることができ、順序に依存するルールも適用されます。実際には、「main.swift」で実行されるコードの最初の行は、プログラムのメイン エントリポイントとして暗黙的に定義されます。これにより、最小限の Swift プログラムを 1 行にすることができます — その行が「main.swift」にある限り。

于 2016-08-24T19:21:28.157 に答える
1

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

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

Swift 3 では、同じファイルのどこからでもアクセスできるようにprivateなります。in Swift 3 には、期待どおりの動作があり、アクセスはクラス/構造体/列挙型自体内でのみ許可されます。fileprivateprivate

于 2016-08-24T19:20:41.533 に答える