ObjectiveC.swift
標準ライブラリのファイルには、228行目の次の数行のコードが含まれています。
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
open var
この文脈では何を意味しますか、またはopen
一般的にキーワードは何ですか?
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ベータ6で利用できます。
要するに:
open
クラスがありアクセスと、サブクラス化は定義しているモジュールの外。open
クラスのメンバであるアクセスおよび
オーバーライド定義モジュールの外部。public
クラスは、アクセスが、サブクラスはできません定義しているモジュールの外。public
クラスのメンバは、アクセスが、
オーバーライド可能ではない定義しているモジュールの外。だから、open
何であるpublic
以前スウィフトのリリースとのアクセスであることに使用されるpublic
制限されています。または、Chris LattnerがSE-0177に次のように記述しているように、
パブリックアクセスとパブリックオーバーライド可能性を区別できるようにします。
「オープン」は単に「パブリックよりパブリック」になり、非常にシンプルでクリーンなモデルを提供します。
あなたの例でopen var hashValue
は、はアクセス可能で、NSObject
サブクラスでオーバーライドできるプロパティです。
その他の例と詳細については、SE-0117をご覧ください。
public
、Swift 3はpublic final
Swift 2とopen
同じで、public
?
開いて読む
他のモジュールで継承のためにオープン
他のモジュールで継承のためにオープンを繰り返します。したがって、オープンクラスは、定義モジュールを含む他のモジュールでサブクラス化するためにオープンです。開いている変数と関数は、他のモジュールでオーバーライドするために開いています。最も制限の少ないアクセスレベルです。パブリックアクセスが他のモジュールでの継承のために閉じられていることを受け入れるのは良いことです。
Apple Docsから:
オープンアクセスはクラスとクラスメンバーにのみ適用され、パブリックアクセスとは次の点で異なります。
パブリックアクセス、またはより限定的なアクセスレベルを持つクラスは、それらが定義されているモジュール内でのみサブクラス化できます。
パブリックアクセスまたはより制限されたアクセスレベルを持つクラスメンバーは、それらが定義されているモジュール内でのみサブクラスによってオーバーライドできます。
オープンクラスは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートする任意のモジュール内でサブクラス化できます。
- オープンクラスメンバーは、それらが定義されているモジュール内、およびそれらが定義されているモジュールをインポートする任意のモジュール内のサブクラスによってオーバーライドできます。
Openはアクセスレベルであり、Swiftのクラス継承に制限を課すために導入されました。
つまり、オープンアクセスレベルは、クラスとクラスメンバーにのみ適用できます。
クラスで
オープンクラスは、それが定義されているモジュールと、クラスが定義されているモジュールをインポートするモジュールでサブクラス化できます。
クラスのメンバー
同じことがクラスのメンバーにも当てはまります。openメソッドは、それが定義されているモジュールのサブクラスと、メソッドが定義されているモジュールをインポートするモジュールのサブクラスによってオーバーライドできます。
この更新の必要性
ライブラリとフレームワークの一部のクラスは、サブクラス化するように設計されていないため、予期しない動作が発生する可能性があります。ネイティブAppleライブラリは、同じメソッドとクラスをオーバーライドすることもできません。
したがって、この追加の後、彼らはパブリックとプライベートのアクセスレベルを適宜適用します。
詳細については、アクセス制御に関するアップルのドキュメントをご覧ください。
サブクラスを除いてopen class func
、プロジェクトのどこからでもアクセスできます。このようにUtilクラスでオープンクラス関数を定義しているとしましょう
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
次に、ビューコントローラーの任意の場所で、このメソッドにアクセスするだけでアクセスできます。
Utils.printHello()
openは、複数のモジュールを扱うときに再生されます。
オープンクラスは、定義モジュールの外部でアクセスおよびサブクラス化できます。オープンクラスメンバーは、定義モジュールの外部でアクセスおよびオーバーライドできます。
open
とはpublic
?」)