Swiftの「open」キーワードとは何ですか?


334

ObjectiveC.swift標準ライブラリのファイルには、228行目の次の数行のコードが含まれています。

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

open varこの文脈では何を意味しますか、またはopen一般的にキーワードは何ですか?


2
おそらく関連:stackoverflow.com/questions/24003918/...(「の違いは何ですかopenとはpublic?」)
アフマドF

補足:キーワード「open」は「拡張のために開いて、変更のために閉じる」という概念に
由来します

回答:


572

open の実装で導入されたSwift 3の新しいアクセスレベルです。

2016年8月7日のSwift 3スナップショットとXcode 8ベータ6で利用できます。

要するに:

  • openクラスがありアクセス、サブクラス化は定義しているモジュールの外。openクラスのメンバであるアクセスおよび オーバーライド定義モジュールの外部。
  • publicクラスは、アクセスが、サブクラスはできません定義しているモジュールの外。publicクラスのメンバは、アクセスが、 オーバーライド可能ではない定義しているモジュールの外。

だから、open何であるpublic以前スウィフトのリリースとのアクセスであることに使用されるpublic制限されています。または、Chris LattnerがSE-0177に次のように記述しているように、 パブリックアクセスとパブリックオーバーライド可能性を区別できるようにします

「オープン」は単に「パブリックよりパブリック」になり、非常にシンプルでクリーンなモデルを提供します。

あなたの例でopen var hashValueは、はアクセス可能で、NSObjectサブクラスでオーバーライドできるプロパティです。

その他の例と詳細については、SE-0117をご覧ください。


16
つまりpublic、Swift 3はpublic finalSwift 2とopen同じで、public
Clashsoft 2016

16
@Clashsoft:Swift 3の "open"はSwift 2の "public"に似ています。Swift3の "public"にはSwift 2の同等のものはありません(同じモジュール内であっても、最終クラスをサブクラス化することはできません。)
マーティンR

59
それは陽気に反直感的です。概要をありがとう。
GoldenJoe 2016

7
@MikeSに同意します。下位互換性がないため、これは恐ろしい混乱になります。
HughHughTeotl 2016

14
@MikeSアップル-不必要な場合でも別の考え方をします。
Varun Nath、2016年

12

開いて読む

他のモジュールで継承のためにオープン

他のモジュールで継承のためにオープンを繰り返します。したがって、オープンクラスは、定義モジュールを含む他のモジュールでサブクラス化するためにオープンです。開いている変数と関数は、他のモジュールでオーバーライドするために開いています。最も制限の少ないアクセスレベルです。パブリックアクセスが他のモジュールでの継承のために閉じられていることを受け入れるのは良いことです。

Apple Docsから:

オープンアクセスはクラスとクラスメンバーにのみ適用され、パブリックアクセスとは次の点で異なります。

  1. パブリックアクセス、またはより限定的なアクセスレベルを持つクラスは、それらが定義されているモジュール内でのみサブクラス化できます。

  2. パブリックアクセスまたはより制限されたアクセスレベルを持つクラスメンバーは、それらが定義されているモジュール内でのみサブクラスによってオーバーライドできます。

  3. オープンクラスは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートする任意のモジュール内でサブクラス化できます。

  4. オープンクラスメンバーは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートする任意のモジュール内のサブクラスによってオーバーライドできます。

5

Openはアクセスレベルであり、Swiftのクラス継承に制限を課すために導入されました。

つまり、オープンアクセスレベルは、クラスとクラスメンバーにのみ適用できます。

クラスで

オープンクラスは、それが定義されているモジュールと、クラスが定義されているモジュールをインポートするモジュールでサブクラス化できます。

クラスのメンバー

同じことがクラスのメンバーにも当てはまります。openメソッドは、それが定義されているモジュールのサブクラスと、メソッドが定義されているモジュールをインポートするモジュールのサブクラスによってオーバーライドできます。

この更新の必要性

ライブラリとフレームワークの一部のクラスは、サブクラス化するように設計されていないため、予期しない動作が発生する可能性があります。ネイティブAppleライブラリは、同じメソッドとクラスをオーバーライドすることもできません。

したがって、この追加の後、彼らはパブリックとプライベートのアクセスレベルを適宜適用します。

詳細については、アクセス制御に関するアップルのドキュメントをご覧ください。


1

サブクラスを除いてopen class func、プロジェクトのどこからでもアクセスできます。このようにUtilクラスでオープンクラス関数を定義しているとしましょう

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

次に、ビューコントローラーの任意の場所で、このメソッドにアクセスするだけでアクセスできます。

Utils.printHello()

3
この答えはパブリックとの違いを説明していません。パブリックでも同じことができるからです。
ホセ・ラミレス

それについてもう少し説明が必要
MD Aslam Ansari 2017

1

openは、複数のモジュールを扱うときに再生されます。

オープンクラスは、定義モジュールの外部でアクセスおよびサブクラス化できます。オープンクラスメンバーは、定義モジュールの外部でアクセスおよびオーバーライドできます。


0

openは、別のモジュール(例:ココアポッド、または単体テスト)専用です。継承またはオーバーライドできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.