Некоторые специальные классы, такие как UIView, имеют более одного назначенного инициализатора.Ручная инициализация UIView в swift
В Objective-X, мы могли бы учитывать общую инициализацию в отдельную функцию
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self initialize];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self initialize];
}
return self;
}
В Swift это уже не возможно, потому что следующий код приводит к самостоятельной аудиторной используется до super.init вызова '
override init(frame: CGRect) {
self.initialize()
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
self.initialize()
super.init(coder: aDecoder)
}
Размещение self.initialize после того, как super.init тоже не помогает, поскольку вся моя цель - инициализация членов. Ниже приведет к «собственности не self.x инициализируется при super.init вызове»
var X : Int
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
Что я должен делать, если я хочу, чтобы учитывать общую инициализацию в этом случае? Обратите внимание, что я специально не хочу использовать awakeFromNib, потому что хочу, чтобы мои объекты были доступны в любых связанных реализациях awakeFromNib в моей иерархии объектов. Обратите также внимание на то, что опции не имеют смысла для моего варианта использования.
Это для случая, когда я хочу nonoptional переменную. Кажется, единственное решение в этом случае - использовать значение по умолчанию. Однако это не касается случая взаимозависимости между дефолтами. Например, что, если у меня есть неопциональный Y, который зависит от того, что происходит по неопровержимому X по умолчанию? – graveley
Инициализатор переменной экземпляра (в объявлении переменной) не может ссылаться на 'self', любую другую переменную экземпляра или любой аргумент' init'. Так оно и есть. Да, это отстой. –
Итак, некоторые функции просто невозможны, если вы хотите использовать nonoptionals. Вы должны настроить свой выбор типа, чтобы быть тем, чего вы никогда не хотели просто согласовать с языковыми ограничениями. Тот факт, что эти случаи существуют, также означает, что иногда, при рефакторинге или добавлении функций, вам нужно будет изменить свои неопъединения на дополнительные параметры, чтобы они работали правильно. Таким образом, люди просто в конечном итоге используют опции в таких случаях, даже для вещей, которые всегда гарантируются. – graveley