2014-10-30 43 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?) 

它可以讓你創建的便利初始化,當你在自己的代碼調用它,它會使用它,但該框架的實施會從外部代碼調用。這對我來說似乎是一個錯誤,它會允許你聲明一個具有相同名稱的擴展便利初始值設定項,因爲我找不到調用原始初始化項的方法,所以你將按照你寫的方式獲得無限遞歸它。