Swift - 如何覆盖init函数? (是Objective-C中的一个类别)

时间:2014-10-30 22:10:23

标签: swift uistoryboard categories init

我有 Objective-C 类别用于自定义

UIStoryboard's '+ (UIStoryboard *)storyboardWithName:(NSString *)name'.

用于确定处理多个设备时要调用的故事板文件。现在我需要将其更改为Swift。

似乎我需要创建一个" Swift Extension ",但是我遇到了让它运转的问题。

这就是我所拥有的:

extension UIStoryboard {
    convenience init(name: String, storyboardBundleOrNil: NSBundle?)
    {
        var storyboard: UIStoryboard?
        var storyboardName: String?

        // Don't adjust name if it's universal storyboard (Xcode 6, iOS 8)
        storyboardName = name;

        if (name.rangeOfString("_Universal") == nil)
        {
            if (UIDevice.currentDevice().userInterfaceIdiom == .Pad)
            {
                storyboardName = storyboardName!+"_iPad"
            }
            else
            {
                storyboardName = storyboardName!+"_iPhone"
            }
        }
//        storyboard = UIStoryboard(name: storyboardName!, storyboardBundleOrNil: storyboardBundleOrNil!)
        assert(storyboard != nil, "Storyboard %@ not found!")
        //return storyboard!;
        self.init(name: storyboardName!, storyboardBundleOrNil: storyboardBundleOrNil!)
    }
}

1 个答案:

答案 0 :(得分:1)

您无法覆盖扩展中的Swift方法。 See the documentation on Extensions for reference.

  

您不能使用扩展来覆盖Objective-C类型上的现有方法或属性。

您还使用了错误的签名。正确的签名是

init(name: String, bundle: NSBundle?)

它允许您创建便利初始化程序,当您在自己的代码中调用它时它将使用它,但框架的实现从外部代码调用。对我来说似乎是一个错误,它允许你声明一个具有相同名称的扩展便利初始化程序,因为我无法找到调用原始初始化程序的方法,所以你将以你的方式获得无限递归# 39;写了它。