我有这个课:
class MyStoryboard: UIStoryboard {
override init() {
super.init(name: "SomeName", bundle: nil);
}
}
Swift不接受此设置,因为我没有调用指定的初始化程序。但是UIStoryBoard的标头有
@availability(iOS, introduced=5.0)
class UIStoryboard : NSObject {
init(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard
func instantiateInitialViewController() -> AnyObject
func instantiateViewControllerWithIdentifier(identifier: String) -> AnyObject!
}
这里没有convenience
关键字。但是请说这是一个方便的初始化程序。然后,这应该工作:
class CharacterStoryboard: UIStoryboard {
convenience override init() {
self.init(name: "SomeName", bundle: nil);
}
}
但这会产生错误“调用中的额外参数'name'”,好像该初始化程序根本不存在。
我发现的唯一解决方法是执行以下操作:
class CharacterStoryboard: UIStoryboard {
convenience init(name: String, bundle storyboardBundleOrNil: NSBundle?) {
self.init(name: name, bundle: storyboardBundleOrNil)
}
convenience override init() {
self.init(name: "SomeName", bundle: nil);
}
}
这只是Swift中的错误,还是我缺少重要的东西?
更新
正如我早先已经发现的那样,这段代码在运行时会创建一个无限循环。
我认为这绝对是Swift的错误,我应该注意一下。
是的,几乎可以肯定这是一个错误。与Apple一起提交文件可能是一个好主意。
某些ObjC API的怪异情况是仅将它们的工厂方法作为“排序”初始化程序导入到Swift中。您可以看到这种情况,UIStoryboard
因为init(...)
签名具有返回类型:
init(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard
^^^^^^^^^^^^^^^
您无法init
在自己的Swift代码中声明带有返回类型的,这只是ObjC到Swift导入程序的构件。并且当您有一个这样导入的类时,您会陷入无法编写init
调用指定的初始化器的子类的情况(因为据Swift所知,没有指定的初始化器),并且您无法调用要么是工厂方法。所以,听起来像个虫子。
请注意,即使此问题得到解决,您可能仍然需要重写,init(name:bundle:)
然后才能从自己的方法调用它convenience init()
。我希望此类的正确Swift API具有一个失败的初始化程序(因为您可以指定磁盘上不存在的名称或捆绑软件)。如果你想实现一个非失败init()
的failable而言init?(...)
,你必须通过一个委托的两倍init!(...)
,因为看到这个答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句