Я наткнулся на этот пост, исследуя ту же проблему. Прошло несколько лет с тех пор, как это было опубликовано, поэтому, вероятно, это не поможет ОП на данный момент, но будет полезно для всех, кто ищет эту проблему.
Увидев этот пост, я провел дополнительные исследования. Оказывается, на самом деле можно создать подкласс UIAlertAction с пользовательской инициализацией, по крайней мере, с версией Swift, используемой на момент написания этой статьи. Я все равно отвечу, как если бы это было направлено на ОП.
Вам нужно определить свой init как удобный init, и тот, который вы в настоящее время вызываете как super.init, также является удобным init. В суперклассах можно вызывать только назначенные инициализаторы (отсюда и ошибка). Я также хотел сослаться на UIAlertController, к которому привязано действие в моем случае использования, поэтому у меня также есть переменная экземпляра в игре. Я также использую здесь свой собственный подкласс UIAlertController.
class MyAlertAction: UIAlertAction {
var alertController: MyAlertController? = nil
convenience init(
alertController: MyAlertController,
title: String?,
style: UIAlertAction.Style,
handler: ((UIAlertAction) -> Void)?
) {
// init must be called before instance variables and functions are referenced
self.init(title: title, style: style, handler: handler)
self.alertController = alertController
}
}
Причина, по которой это работает, заключается в том, что либо в подклассе не были определены назначенные инициализаторы, либо все назначенные инициализаторы из суперкласса были реализованы в подклассе. В этих двух случаях все вспомогательные инициализаторы из суперкласса наследуются (кроме тех, у которых совпадающие подписи в подклассе). Это единственный способ вызвать удобный инициализатор из суперкласса, потому что, как упоминалось ранее, super.init ограничен назначенными инициализаторами.
Поскольку в моем примере нет реализации назначенных инициализаторов, подкласс также наследует все назначенные инициализаторы от суперкласса. Таким образом, не определяя никаких назначенных инициализаторов, все инициализаторы из суперкласса доступны, как если бы они были определены в подклассе.
В книге Swift есть целая статья об инициализации, доступная по адресу https://docs.swift.org/swift-book/LanguageGuide/Initialization.html. Особый интерес в данном случае представляют следующие четыре подраздела:
- Делегирование инициализатора для типов классов: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID219
- Двухэтапная инициализация: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID220
- Наследование и переопределение инициализатора: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID221
- Автоматическое наследование инициализатора: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID222
person
theeternalsw0rd
schedule
21.03.2021