1. ホーム
  2. access-modifiers

[解決済み】Swiftにアクセス修飾語はあるのか?

2022-04-14 06:33:55

質問

Objective-Cでは、インスタンスデータは public , protected または private . 例えば、以下のようになります。

@interface Foo : NSObject
{
  @public
    int x;
  @protected:
    int y;
  @private:
    int z;
  }
-(int) apple;
-(int) pear;
-(int) banana;
@end

Swiftのリファレンスにアクセス修飾子についての記載がないのですが。Swiftでデータの可視性を制限することは可能なのでしょうか?

どのように解決するのですか?

現在 Swift 3.0.1 があります。 4段階のアクセス権 以下、最高(最も制限の少ないもの)から最低(最も制限の多いもの)へと説明します。


1. openpublic

定義されたモジュール(ターゲット)の外側でエンティティを使用できるようにします。通常 open または public フレームワークのパブリックインターフェイスを指定する際に、アクセスすることができます。

しかし open アクセスは、クラスとクラス・メンバにのみ適用されます。 とは異なり public アクセスは次のようになります。

  • public クラスおよびクラスメンバは、定義モジュール(ターゲット)内でのみサブクラス化およびオーバーライドすることができます。
  • open クラスとクラス・メンバーは、定義モジュール(ターゲット)の内側と外側の両方でサブクラス化およびオーバーライドすることができます。

// First.framework – A.swift

open class A {}

// First.framework – B.swift

public class B: A {} // ok

// Second.framework – C.swift

import First

internal class C: A {} // ok

// Second.framework – D.swift

import First

internal class D: B {} // error: B cannot be subclassed

2. internal

定義されたモジュール(ターゲット)内でエンティティを使用できるようにする。通常 internal アクセスは、アプリやフレームワークの内部構造を定義するときに使用します。

// First.framework – A.swift

internal struct A {}

// First.framework – B.swift

A() // ok

// Second.framework – C.swift

import First

A() // error: A is unavailable

3. fileprivate

エンティティの使用をその定義されたソースファイルに制限します。通常 fileprivate アクセスは、特定の機能の実装の詳細がファイル全体で使用されている場合に、その詳細を隠すために使用します。

// First.framework – A.swift

internal struct A {

    fileprivate static let x: Int

}

A.x // ok

// First.framework – B.swift

A.x // error: x is not available

4. private

あるエンティティの使用を、それを囲む宣言に限定する。通常 private アクセスは、特定の機能の実装の詳細が単一の宣言の中でしか使用されない場合に、その詳細を隠すために使用します。

// First.framework – A.swift

internal struct A {

    private static let x: Int

    internal static func doSomethingWithX() {
        x // ok
    }

}

A.x // error: x is unavailable