В языке программирования Swift обязательно, чтобы
«Назначенный инициализатор должен убедиться, что все свойства, введенные его классом, инициализированы, прежде чем он делегирует инициализатору суперкласса». источник цитаты из другого s/o
В противном случае будет отображаться ошибка, подобная следующей
Свойство self.baz не инициализируется при вызове super.init
Я хотел бы реализовать следующий код Objective-C в Swift:
@interface FooBar : NSObject
@property (nonatomic, readonly) NSString *baz;
@end
@implementataion FooBar
@synthesize baz = _baz;
- (instancetype)initWithString:(NSString *)string {
self = [super init];
if (self) {
_baz = [self parseString:string];
}
return self;
}
- (NSString *)parseString:(NSString *)string {
// Perform something on the original string
return ...;
}
@end
Следующая реализация выдала бы ошибку компилятора, как описано выше:
class FooBar: NSObject {
let baz: NSString?
init(string: NSString?) {
super.init()
baz = parseString(string)
}
private func parseString(string: NSString?) -> NSString? {
// Perform something on the original string
return ...;
}
}
И если бы я сделал следующее, я бы получил сообщение об ошибке
Использование self в вызове метода 'parseString' до того, как super.init инициализирует себя
class FooBar: NSObject {
let baz: NSString?
init(string: NSString?) {
baz = parseString(string)
super.init()
}
private func parseString(string: NSString?) -> NSString? {
// Perform something on the original string
return string;
}
}
Итак, мое решение в настоящее время заключается в использовании метода частного класса:
class FooBar: NSObject {
let baz: NSString?
init(string: NSString?) {
baz = FooBar.parseString(string)
super.init()
}
private class func parseString(string: NSString?) -> NSString? {
// Perform something on the original string
return ...;
}
}
Мой вопрос в том, есть ли лучший способ добиться того же или метод частного класса - лучший подход?