在Swift 3.0中引入open
关键字(What is the 'open' keyword in Swift?)。
注意:仅限于NSObject
派生类或@objc
归因方法/属性的附加信息。
在模块/框架中扩展的public
(class
)方法/属性声明并使用了代码,因为public
不再意味着&# 39;可重写'在定义模块之外。
示例:
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()
)问题:是否有解决方法可以跨模块/框架覆盖扩展提供的方法/属性?
答案 0 :(得分:8)
除非我弄错了,否则你可以将扩展方法声明为
如果您省略open
关键字,则在您的框架中public
在扩展声明中:
extension UIManagedDocument {
open class func primaryDocumentName() -> String {
return "Document"
}
// ...
}
然后(对于NSObject
子类或@objc
成员),您可以覆盖该方法
在主应用程序(或任何模块)中的自定义子类中:
class MyManagedDocument: UIManagedDocument {
override class func primaryDocumentName() -> String {
return "MyDocument"
}
// ...
}
答案 1 :(得分:3)
协议示例:
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"
}
}