【发布时间】:2016-08-25 09:50:44
【问题描述】:
在 Swift 3.0 (What is the 'open' keyword in Swift?) 中引入了 open 关键字。
注意:仅限于 NSObject 派生类或 @objc 属性化方法/属性的扩展。
在扩展模块/框架中声明和使用public (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"
}
}
- 原始提案 (SE-0117) 专注于子类化,没有提及扩展。
- 目前扩展不支持
open关键字(你不能写open extension NSObject和open func Method())
问题:是否有解决方法可以覆盖跨模块/框架的扩展提供的方法/属性?
【问题讨论】:
-
这真的与新的开放与公共访问模式有关吗?除非我弄错了,否则无论如何你都不能覆盖在扩展中声明的方法,无论是在 Swift 2 还是在 Swift 3 中)。
-
您对 pure swift 类是正确的,但可以在 NSObject 派生类以及
@objc属性方法/属性上使用。 (Can you override between extensions in Swift or not?) -
我明白了,谢谢。 (也许您可以将该信息添加到问题中)。
-
感谢您提醒我自己的答案 :)
标签: ios swift syntax swift-extensions