標準ライブラリの ObjectiveC.Swift
ファイルには、228行目前後に次の数行のコードが含まれています。
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
この文脈でopen var
はどういう意味ですか、または一般的にopen
キーワードとは何ですか?
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 を見てください。
として開く
他のモジュールの継承用にオープン
私は他のモジュールの継承のためにopenを繰り返します。そのため、オープンクラスは、定義しているモジュールを含む他のモジュールでサブクラス化することができます。開いている変数と関数は他のモジュールでオーバーライドするために開いています。その最も制限の少ないアクセスレベル。パブリックアクセスが他のモジュールでの継承のためにクローズされていることをパブリックアクセスが受け入れるのと同じくらい良いです。
アップルドキュメント :から
オープンアクセスはクラスとクラスメンバーにのみ適用され、以下の点でパブリックアクセスとは異なります。
パブリックアクセス、またはより制限的なアクセスレベルを持つクラスは、それらが定義されているモジュール内でのみサブクラス化できます。
パブリックアクセス、またはより制限的なアクセスレベルを持つクラスメンバーは、それらが定義されているモジュール内でのみサブクラスによってオーバーライドできます。
オープンクラスは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートするモジュール内でサブクラス化できます。
- オープンクラスメンバーは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートするモジュール内のサブクラスによってオーバーライドされることがあります。
Openはアクセスレベルであり、Swiftのクラス継承に制限を加えるために導入されました。
これは、 open アクセスレベルは クラスとクラスメンバー にのみ適用できることを意味します。
クラス内
オープンクラスは、それが定義されているモジュール内、およびクラスが定義されているモジュールをインポートするモジュール内でサブクラス化することができます。
クラスメンバーの場合
同じことがクラスメンバーにも当てはまります。 openメソッドは、それが定義されているモジュール内、およびそのメソッドが定義されているモジュールをインポートするモジュール内のサブクラスによってオーバーライドされる可能性があります。
このアップデートに必要なもの
ライブラリやフレームワークのクラスによっては、サブクラス化するように設計されていないため、予期しない動作が生じる可能性があります。ネイティブのAppleライブラリでも、同じメソッドやクラスをオーバーライドすることはできません。
それで、この追加の後、彼らはそれに応じて公衆と私設のアクセスレベルを適用するでしょう。
詳細については、 アクセス制御に関するアップルのドキュメント を参照してください。
複数のモジュールを扱う場合はopenが有効になります。
オープンクラスは定義しているモジュールの外でアクセス可能でサブクラス化可能です。オープンクラスメンバは、定義モジュールの外部でアクセス可能で上書き可能です。
openは他のモジュール、例えばココアポッド、または単体テストに限ります
サブクラスを除いて、open class func
はあなたのプロジェクトのどこからでもアクセス可能です。あなたのUtilクラスで、このようにオープンクラスの関数を定義しているとしましょう。
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
それからあなたのView Controllerのどこでも、あなたは単に呼び出すことによってこのメソッドにアクセスすることができます
Utils.printHello()