gpt4 book ai didi

ios - Swift 'open' 关键字和扩展中的可覆盖方法/属性?

转载 作者:IT王子 更新时间:2023-10-29 05:36:11 25 4
gpt4 key购买 nike

在 Swift 3.0 中引入了 open 关键字 (What is the 'open' keyword in Swift?)。

注意:仅限于 NSObject 派生类或 @objc 属性方法/属性的扩展。

声明和使用 public (class) 方法/属性的代码在扩展 across 模块/框架中损坏,因为 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 NSObjectopen func Method())

问题:是否有解决方法可以覆盖扩展提供的方法/属性模块/框架?

最佳答案

除非我弄错了,否则您可以将扩展方法声明为如果您只是省略 public 关键字,则在您的框架中使用 open在扩展声明中:

extension UIManagedDocument {

open class func primaryDocumentName() -> String {
return "Document"
}
// ...
}

然后(对于 NSObject 子类或 @objc 成员)您可以覆盖该方法在主应用程序(或任何模块)的自定义子类中:

class MyManagedDocument: UIManagedDocument {

override class func primaryDocumentName() -> String {
return "MyDocument"
}
// ...
}

关于ios - Swift 'open' 关键字和扩展中的可覆盖方法/属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com