2015-12-01 127 views
2

我有一個Objective-C初始值設定項(來自另一個項目),我發現它很有用。現在我想將它移植到Swift中,並且Swift的命名約定存在問題。重寫Objective-C無參數初始化爲Swift方便初始化

.H

@interface UIViewController (FromNib) 
-(nullable instancetype)initFromNib; 
@end 

的.m

#import "FromNib.h" 

@implementation UIViewController (FromNib) 

-(nullable instancetype)initFromNib { 

    self = [self initWithNibName: NSStringFromClass([self class]) 
          bundle: [NSBundle mainBundle]]; 

    if (self == nil) { 

     NSLog(@"\nNib with name %@ not found in the main bundle.\n", NSStringFromClass([self class])); 
    } 

    return self; 
} 

@end 

由於Objective-C的識別方法,其名稱與init開始它把從initinitWith...作爲initFrom不同。 Swift根據傳遞的參數進行區分。只有這樣,(我認爲),使init()不同於我的初始化是通過僞參數:

extension UIViewController { 

    convenience init(FromNib:Int) { 
     self.init() 
     // the rest of the code 
    } 
} 

有沒有寫在斯威夫特一個無參數的init不同的方式,並避免它被混同指定init()

+2

不是默認的'UIViewController.init'和你的'initWithNib'完全一樣嗎?無論如何,唯一的解決方法是使用「類方法」,例如'class func createFromNib(){...}'。 – Sulthan

+2

請注意,虛擬參數*可以是void:'便捷init(fromNib:Void)',然後將其稱爲'let vc = ViewController(fromNib:())'。 –

+1

但是@Sulthan是正確的:'let vc = MyViewController()'從主包中的「MyViewController.nib」自動加載視圖控制器。 –

回答

0

@Sulthan和@Martin R

好點。默認init()就是這樣做的。謝謝。問題解決了。