クラス、クラスのプロパティ、メソッド、enum、関数など、あらゆるものにアクセスレベルを適用できます。

アクセスレベルの種類

アクセスレベルの種類は以下の3つに分かれます。

private クラス、構造体の中のみ、もしくは同一ファイルのみでアクセス可能
internal 同一モジュール内でのみアクセス可能
public モジュール外からもアクセス可能

C++、Javaのようにprotectedはありません。

private

以下のようにprivateで宣言したプロパティやメソッドは、MyClassの中でしかアクセスできません。

class MyClass {
    private var name: String
    private var price: Int
    private func method1() {
        // Do something.
    }
}

以下はアクセスレベルの制限によりコンパイルエラー。

class MyClass2 {
    func method1() {
        var myObject = MyClass()
        // コンパイルエラー
        myObject.name = "name01"
        // コンパイルエラー
        myObject.method1()
    }
}

以下のようにprivateで宣言した変数、関数は、ファイルの中でしかアクセスできません。

private let MaxPrice = 1000
private func func1() {
    // Do something.
}

internal

internalはデフォルトのアクセスレベルで、同一モジュール内ならどこからでもアクセス可能です。

class MyClass {
    // 暗黙的にinternal宣言
    var name: String = ""
    // 明示的にinternal宣言
    internal var price: Int = 0
    // 暗黙的にinternal宣言
    func method1() {
        // Do something.
    }
    // 明示的にinternal宣言
    internal func method2() {
        // Do something.
    }
}

これらは別のクラスなどからもアクセス可能です。

class MyClass2 {
    func method1() {
        var myObject = MyClass()
        myObject.name = "name01"
        myObject.method1()
    }
}

モジュール

publicの説明をする前にモジュールの説明をしておきます。

プロジェクト内では意識しませんが、プロジェクト内のコードはProduct Nameと同じ名前のモジュールに属しています。Product NameはBuild Settings > Packaging > Product Nameで定義されていて、通常はプロジェクト名と同じです。

仮にモジュール名(Product Name)がWinenoteだとしましょう。このプロジェクトで宣言されたクラスはWinenoteモジュールに属しています。以下の様な場合に、モジュールを意識することになります。

  • プロジェクトがライブラリ、フレームワークで、他のプロジェクトから参照する場合
  • XCTestなどテストプロジェクトから参照する場合

public

アプリのプロジェクトを生成すると自動的に生成されるXCTestを例にしましょう。

publicでの宣言。

public class MyClass {
    public var name: String = ""
    public var price: Int = 0
    public func method1() {
        // Do something.
    }
}

XCTestでWinenoteモジュールにアクセスする方法。

import XCTest
// Winenoteモジュールをimport
import Winenote

class PSNoteTests: XCTestCase {
    func testExample() {
        var obj = MyClass()
        obj.name = "name1"
        XCTAssert(obj.name, "name1")
    }
}

iOSのアプリ開発では、テストコードを書きたいものに関してはpublicで宣言する必要があると思います。