2015-12-01 3 views
2

У меня есть инициализатор Objective-C (из другого проекта), который я нашел полезным. Теперь я хочу перенести его в Swift, и есть проблема с соглашением об именах Swift.Переписывание Objective-C без параметров init в Swift удобство init

.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 он рассматривает init в отличие от initWith... или initFrom. Свифт делает различие на основе принятых аргументов. Единственный способ (я думал), чтобы сделать init() отличающиеся от моего инициализатора это передать фиктивный аргумент:

extension UIViewController { 

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

Есть ли другой способ, чтобы написать без параметров инициализации в Swift, и избежать его путать с назначенный init()?

+2

Не по умолчанию 'UIViewController.init' делает то же самое, что и' initWithNib'? Во всяком случае, единственным обходным путем является использование метода класса, например. 'class func createFromNib() {...}'. – Sulthan

+2

Обратите внимание, что фиктивный аргумент * может быть недействительным: 'удобство init (fromNib: Void)', которое затем будет вызываться как 'let vc = ViewController (fromNib:())'. –

+1

Но @Sulthan прав: 'let vc = MyViewController()' автоматически загружает контроллер вида из «MyViewController.nib» в основной пакет. –

ответ

0

@Sulthan и @Martin R

Хороший момент. Значение по умолчанию init() делает именно это. Спасибо. Задача решена.

Смежные вопросы