【问题标题】:How to set a non optional variable with a convenience initializer in swift?如何在swift中使用便利初始化程序设置非可选变量?
【发布时间】:2014-12-19 16:58:50
【问题描述】:

我有一个 UITableViewController 子类,如果没有模型,它不应该工作。如果没有模型,那么显示视图就没有任何目的。

所以我在想,我的模型属性不应该是可选值。我想要这样的安全感。所以我正在尝试创建一个方便的 init 来传递我的模型。

let model:Client

override init() {
    super.init(style: UITableViewStyle.Plain)
}

convenience init(model:Client) {
    self.init()
    self.model = model
}

我的问题是我收到了这个错误:

Property 'self.model' not initialised at super.init call

这是有道理的。如果要调用 init(),则不会按照非可选属性的要求设置属性。

我要克服这个吗?

请记住,该模型是我的实际模型,在此处设置默认值将毫无意义,并且再次破坏了我正在寻找的安全性。

谢谢!

小记:这样做,也行不通。反正没有实例可以设置模型。

convenience init(model:Client) {
    self.model = model
    self.init()
}

编辑:下面的方法看起来很有希望

let model: Client

required init(coder aDecoder: NSCoder) {
    preconditionFailure("Cannot initialize from coder")
}

init(model:Client) {
    self.model = model
    super.init(style: UITableViewStyle.Plain)
}

但是,它给我这个错误:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)'

最后,这里的解决方案是调用:

super.init(nibName: nil, bundle: nil)

【问题讨论】:

  • 这似乎是一个隐式展开可选的用例。它是可选的(即您可以编译应用程序而无需在init 中初始化它),但无论何时您尝试使用它,它都会为您无缝解包。

标签: swift initializer convenience-methods


【解决方案1】:

您不需要在这里覆盖init(),并且您希望将init(model:) 设为您指定的初始化程序(不方便)。你可以这样做

let model: Client

required init(coder aDecoder: NSCoder) {
    preconditionFailure("Cannot initialize from coder")
}

init(model:Client) {
    self.model = model
    super.init(style: UITableViewStyle.Plain)
}

【讨论】:

  • 太棒了!谢谢先生:) +1 为常数。我一直忘记这一点。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多