web-dev-qa-db-ja.com

プライベート変数はクラス外からアクセスできます

これは、単純化するためにPlaygroundで行われました。

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"

コンパイラの警告はありません。実際、オートコンプリートはprivを問題なく表示しています。私の理解では、クラスの{}の境界外では、funcvarというプライベートなものを見ることができないはずです。

何か不足していますか?

32
bauerMusic

Swiftのアクセス修飾子は、他の言語とは異なる方法で実装されます。3つのレベルがあります。

privateその特定のファイル内でのみアクセス可能

internal:モジュール(プロジェクト)内でのみアクセス可能

public:どこからでもアクセス可能

特に明記されていない限り、デフォルトではinternalになります。

Swiftブログにはアクセス制御に関する投稿がありました ベータ4で機能が導入されたとき、 Appleのドキュメントには章があります もあります。

45
Nate Cook

注:この回答はSwift 2


Swift Programming Language)状態:

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

Swiftでprivateアクセスレベルをテストする必要がない場合は、次のステップバイステップが役立ちます。

1 /新しいXcodeプロジェクトを作成します。

2 /ファイルMyPrivateVar.Swiftを作成し、次のコードを追加します。

class MyPrivateVar {

    private var priv: String? = nil

}

3/2つ目のファイルMySecondClass.Swiftを作成し、次のコードを追加します。

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

XcodeはすぐにSwiftコンパイラエラーメッセージを表示します:

「MyPrivateVar」には「priv」という名前のメンバーがありません

4 /ここで、プロジェクトから以前の2つのファイルを削除し、次のコードを含む単一のファイルTwoClassesInAFile.Swiftを作成します。

class MyPrivateVar {

    private var priv : String? = nil

}

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

今回は、Swiftコンパイラエラーメッセージは表示されず、MyPrivateVarprivは同じファイル内にあるため、MySecondClassからprivMySecondClassプライベートプロパティにアクセスできます(あなたの TwoClassesInAFile.Swift file)。

さらに、アクセスレベルはグローバル変数でも機能します。たとえば、次のコードが同じViewController.Swiftファイルの一部である場合、Xcodeはコンパイラエラーを返しません。

import UIKit

private var globalPrivate : String? = nil

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        globalPrivate = "some string"
        println(globalPrivate)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

ただし、 ViewController.Swift の外部でglobalPrivateを定義すると、Xcodeはエラーメッセージを生成します。

未解決の識別子「globalPrivate」の使用

8
Imanou Petit