Swift:“failable initializer’init()’不能覆盖不可用的初始化程序”与默认参数

Swift:“failable initializer’init()’不能覆盖不可用的初始化程序”与默认参数,第1张

概述如果我宣布 public class A: NSObject { public class X { } public init?(x: X? = nil) { }} 一切都很好.当像使用a = A()一样使用它时,初始化器按预期调用. 现在,我想让嵌套的类X私有,并且参数化的init也必须(当然必须是).但是一个简单的init?()应该像以前一样公开.所以我写 public cl 如果我宣布
public class A: NSObject {    public class X { }    public init?(x: X? = nil) { }}

一切都很好.当像使用a = A()一样使用它时,初始化器按预期调用.

现在,我想让嵌套的类X私有,并且参数化的init也必须(当然必须是).但是一个简单的init?()应该像以前一样公开.所以我写

public class B: NSObject {    private class X { }    private init?(x: X?) { }    public convenIEnce overrIDe init?() { self.init(x: nil) }}

但这会给init?()初始化程序带来错误:failable初始化程序’init()’不能覆盖不可用的初始化程序,而重写的初始化程序是NSObject中的公共init().

为什么我可以有效地声明一个初始化器A.init?()没有冲突而不是B.init?()?

奖金问题:为什么我不允许使用可用的初始化程序覆盖不可用的初始化程序?相反的是合法的:我可以使用非可用的覆盖可用的初始化程序,这需要使用强制的super.init()!因此引入了运行时错误的风险.对我来说,让子类具有可用的初始化器感觉更加明智,因为功能的扩展会带来更多的失败机会.但也许我在这里遗漏了一些东西 – 解释非常感谢.

这就是我为我解决问题的方法:

我可以申报

public convenIEnce init?(_: VoID) { self.init(x: nil) }

并使用它

let b = B(())

甚至

let b = B()

– 这是合乎逻辑的,因为它的签名是(种类)不同,所以没有覆盖在这里.只使用VoID参数并在通话中省略它感觉有点奇怪……但是我认为最终证明了手段的合理性. 总结

以上是内存溢出为你收集整理的Swift:“failable initializer’init()’不能覆盖不可用的初始化程序”与默认参数全部内容,希望文章能够帮你解决Swift:“failable initializer’init()’不能覆盖不可用的初始化程序”与默认参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1041675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存