【问题标题】:How to redefine default class init() in extension in Swift?如何在 Swift 的扩展中重新定义默认类 init()?
【发布时间】:2019-12-23 11:09:21
【问题描述】:

我已经有一个待办事项列表应用程序的类描述,如下所示:

class TaskStore: ObservableObject {
    @Published var tasks: Task = [
        Task("Programm app"),
        Task("Clean up apartment",
        Task("Buy NY gifts")
        Task("Decorate Christmas tree")
    ]
}

我想使用扩展名重新定义它的初始化程序(不接触以前的代码),以便能够从 .json 文件中读取已经存在的 todos 或默认初始化,如下所示:

extension TaskStore {
    var storedTasks: [Task]? {
        // Code for downloading from .json file 
    }

    init() {
        if let storedTasks = self.storedTasks {
            self.tasks = self.storedTasks
        }
    }
 }

问题在于 XCode 编译器不允许在扩展中放置方便的 init() 或指定的 init(),因为类描述中没有定义 init()。

请帮助(重新)在扩展中定义 init()。

【问题讨论】:

  • 扩展可以为类型添加新功能,但不能覆盖现有功能。
  • 如前所述,您无法更改现有的初始化程序,包括编译器提供的默认初始化程序。不过,您可以添加一个新的初始化程序,例如使用现有初始化程序提供所需功能的 init(fromJSONFile: ...) 或 init(fromExisting: ...)。
  • @bg2b,我想重写 init() 而不添加新参数,因为我根本不想更改视图 - 只需更改模型的某些部分。
  • @iOSArchitect.com,谢谢!我想在不添加新参数的情况下覆盖 init(),因为我根本不想更改视图 - 只是更改(甚至只是添加)模型的某些部分。

标签: swift xcode init


【解决方案1】:

你不能这样做。

扩展为现有的类、结构、 枚举或协议类型。这包括扩展能力 您无权访问原始源代码的类型 (称为追溯建模)。扩展类似于类别 在 Objective-C 中。 (与 Objective-C 类别不同,Swift 扩展可以 没有名字。)

https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

【讨论】:

  • 非常感谢!现在对我来说很清楚了。我想在不添加新参数的情况下覆盖 init(),因为我根本不想更改视图 - 只是更改(甚至只是添加)模型的某些部分。
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 2020-10-16
  • 2017-06-28
  • 2021-01-14
  • 2013-06-15
  • 2016-12-17
相关资源
最近更新 更多