2014-11-03 36 views
1

我有这个类:因为我不是调用指定初始化在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错误,我应该对它进行扫描。

+1

有趣......看起来像在Obj-C工厂方法与快速初始化程序之间桥接的人工制品中。 – 2014-11-03 16:50:17

+0

事实上,从“为了一致性和简单性,Objective-C工厂方法在Swift中被映射为便捷初始值设定项”。 – 2014-11-03 16:56:21

+0

问题是,它似乎无法找到便利初始值设定项,因为“调用中的额外参数名称”错误。我试着直接在我的子类上调用该初始化器,但它不起作用,给出了相同的错误。直接更改UIStoryboard,它确实有效。 – 2014-11-03 17:03:50

回答

1

是的,这几乎肯定是一个错误。 Filing it with Apple is probably a good idea

一些ObjC APIs有一个奇怪的情况,即将其工厂方法导入Swift只是作为“sort-of”初始值设定项;你可以看到这是UIStoryboard的情况下,因为init(...)签名有一个返回类型:

init(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard 
                  ^^^^^^^^^^^^^^^ 

你不能在自己的银行代码返回类型声明init - 这仅仅是ObjC的神器到Swift进口商。而当你有一个这样的导入类时,你会陷入一种情况,你不能编写调用指定初始化器的子类init(因为就Swift而言,它知道没有指定的初始化器),而且你不能调用工厂方法。所以,是的,sounds like a bug

请注意,即使这个问题得到解决,您可能仍然需要覆盖init(name:bundle:),然后再从您自己的convenience init()中调用它。我期望这个类的适当的Swift API有failable initializer(因为你可以指定一个名称或者在磁盘上不存在的包)。如果您希望以失败init?(...)的形式实施非失败init(),则必须通过init!(...),as seen in this answer委托两次。

相关问题