我有这个类:因为我不是调用指定初始化在Swift中,为什么我需要重写此初始化程序才能创建我自己的便捷初始化程序?
class MyStoryboard: UIStoryboard {
override init() {
super.init(name: "SomeName", bundle: nil);
}
}
斯威夫特不接受这一点。但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);
}
}
但这给出了错误“额外的参数‘名称’呼叫”,仿佛这初始化根本不存在。
唯一的解决办法,我发现是这样做:
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);
}
}
这只是在斯威夫特的错误,还是我失去了一些东西重要?
UPDATE
在运行时此代码创建一个无限循环,我应该早发现。
我在想这绝对是一个Swift错误,我应该对它进行扫描。
有趣......看起来像在Obj-C工厂方法与快速初始化程序之间桥接的人工制品中。 – 2014-11-03 16:50:17
事实上,从“为了一致性和简单性,Objective-C工厂方法在Swift中被映射为便捷初始值设定项”。 – 2014-11-03 16:56:21
问题是,它似乎无法找到便利初始值设定项,因为“调用中的额外参数名称”错误。我试着直接在我的子类上调用该初始化器,但它不起作用,给出了相同的错误。直接更改UIStoryboard,它确实有效。 – 2014-11-03 17:03:50