У меня есть инициализатор 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()
?
Не по умолчанию 'UIViewController.init' делает то же самое, что и' initWithNib'? Во всяком случае, единственным обходным путем является использование метода класса, например. 'class func createFromNib() {...}'. – Sulthan
Обратите внимание, что фиктивный аргумент * может быть недействительным: 'удобство init (fromNib: Void)', которое затем будет вызываться как 'let vc = ViewController (fromNib:())'. –
Но @Sulthan прав: 'let vc = MyViewController()' автоматически загружает контроллер вида из «MyViewController.nib» в основной пакет. –