2014-10-30 24 views
0

我有用于定制Swift - 如何覆盖初始化函数? (在目标C的类别)

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

它被用来确定哪一个故事板文件与多个设备处理时调用一个Objective-C的类别。现在我需要将它改为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

代码和错误消息请 – 2014-10-30 22:11:29

+0

更新。没有错误消息,应用程序运行,但是这段代码从未在我的编程调用中执行。 – JimmyJammed 2014-10-30 22:25:18

回答

1

您不能覆盖的扩展斯威夫特方法。 See the documentation on Extensions for reference.

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

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

init(name: String, bundle: NSBundle?) 

它可以让你创建的便利初始化,当你在自己的代码调用它,它会使用它,但该框架的实施会从外部代码调用。这对我来说似乎是一个错误,它会允许你声明一个具有相同名称的扩展便利初始值设定项,因为我找不到调用原始初始化项的方法,所以你将按照你写的方式获得无限递归它。