これは、単純化するためにPlaygroundで行われました。
class MyPrivateVar
{
private var priv: String?
}
var myInstance = MyPrivateVar()
myInstance.priv = "Something"
コンパイラの警告はありません。実際、オートコンプリートはpriv
を問題なく表示しています。私の理解では、クラスの{}の境界外では、func
やvar
というプライベートなものを見ることができないはずです。
何か不足していますか?
Swiftのアクセス修飾子は、他の言語とは異なる方法で実装されます。3つのレベルがあります。
private
:その特定のファイル内でのみアクセス可能
internal
:モジュール(プロジェクト)内でのみアクセス可能
public
:どこからでもアクセス可能
特に明記されていない限り、デフォルトではinternal
になります。
Swiftブログにはアクセス制御に関する投稿がありました ベータ4で機能が導入されたとき、 Appleのドキュメントには章があります もあります。
注:この回答は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コンパイラエラーメッセージは表示されず、MyPrivateVar
とpriv
は同じファイル内にあるため、MySecondClass
からpriv
のMySecondClass
プライベートプロパティにアクセスできます(あなたの 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」の使用