我有 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!)
}
}
答案 0 :(得分:1)
您无法覆盖扩展中的Swift方法。 See the documentation on Extensions for reference.
您不能使用扩展来覆盖Objective-C类型上的现有方法或属性。
您还使用了错误的签名。正确的签名是
init(name: String, bundle: NSBundle?)
它允许您创建便利初始化程序,当您在自己的代码中调用它时它将使用它,但框架的实现从外部代码调用。对我来说似乎是一个错误,它允许你声明一个具有相同名称的扩展便利初始化程序,因为我无法找到调用原始初始化程序的方法,所以你将以你的方式获得无限递归# 39;写了它。