web-dev-qa-db-ja.com

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

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

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

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

289
Clashsoft

openはSwift 3の新しいアクセスレベルです。

2016年8月7日のSwift 3スナップショットとXcode 8 beta 6で利用可能です。

要するに:

  • openクラスは定義モジュールの外側で アクセス可能な サブクラス化可能 です。 openクラスメンバーは定義モジュールの外側で accessible および overridable です。
  • publicクラスは アクセス可能 しかし サブクラス化不可 定義モジュールの外側です。 publicクラスメンバは定義モジュールの外側で アクセス可能 but 上書き不可 です。

そのため、openは以前のSwiftリリースでpublicが使用されていたもので、publicのアクセスは制限されていました。または、Chris Lattnerが SE-0177:パブリックアクセスとパブリックオーバーライド可能性の区別を許可します

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

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

より多くの例と詳細については SE-0117 を見てください。

510
Martin R

として開く

他のモジュールの継承用にオープン

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

アップルドキュメント :から

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

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

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

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

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

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

これは、 open アクセスレベルは クラスとクラスメンバー にのみ適用できることを意味します。

クラス内

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

クラスメンバーの場合

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

このアップデートに必要なもの

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

それで、この追加の後、彼らはそれに応じて公衆と私設のアクセスレベルを適用するでしょう。

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

4
Saranjith

複数のモジュールを扱う場合はopenが有効になります。

オープンクラスは定義しているモジュールの外でアクセス可能でサブクラス化可能です。オープンクラスメンバは、定義モジュールの外部でアクセス可能で上書き可能です。

1

openは他のモジュール、例えばココアポッド、または単体テストに限ります

0
William

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

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

それからあなたのView Controllerのどこでも、あなたは単に呼び出すことによってこのメソッドにアクセスすることができます

Utils.printHello()
0
Fangming