Swift 3.0( Swiftの「open」キーワードとは )にopen
キーワードが導入されました。
注:NSObject
派生クラスまたは_@objc
_属性のメソッド/プロパティの拡張機能に限定されます。
public
が壊れたように、拡張acrossモジュール/フレームワークでclass
(public
)メソッド/プロパティを宣言して使用したコードが壊れましたモジュールの定義外で「オーバーライド可能」を意味しなくなりました。
例:
_public extension UIManagedDocument {
public class func primaryDocumentName() -> String {
return "Document"
}
public class func primaryStoreURL() -> URL {
let documentsURL = FileManager.default.userDocumentsURL
return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL)
}
public class func primaryModelName() -> String? {
return "Model"
}
}
_
open
キーワードをサポートしていません(_open extension NSObject
_およびopen func Method()
を記述できません)質問:拡張機能が提供するメソッド/プロパティ全体モジュール/フレームワークをオーバーライドできる回避策はありますか?
私が間違っていない限り、拡張機能でopen
キーワードを省略した場合は、canフレームワークで拡張メソッドをpublic
として宣言します。宣言:
extension UIManagedDocument {
open class func primaryDocumentName() -> String {
return "Document"
}
// ...
}
次に(NSObject
サブクラスまたは@objc
メンバーの場合)、メインアプリケーション(または任意のモジュール)のカスタムサブクラスのメソッドをオーバーライドできます。
class MyManagedDocument: UIManagedDocument {
override class func primaryDocumentName() -> String {
return "MyDocument"
}
// ...
}
プロトコルの例:
protocol PrimaryDocument {
static func primaryDocumentName() -> String
static func primaryStoreURL() -> URL
static func primaryModelName() -> String?
}
extension UIManagedDocument : PrimaryDocument {
open class func primaryDocumentName() -> String {
return "Document"
}
open class func primaryStoreURL() -> URL {
let documentsURL = FileManager.default.userDocumentsURL
return URL(fileURLWithPath: self.primaryDocumentName(), isDirectory: false, relativeTo: documentsURL)
}
open class func primaryModelName() -> String? {
return "Model"
}
}