это может быть глупый вопрос, и я могу пнуть себя, когда прочитаю решение, но в настоящее время я в тупике.
У меня есть собственный подкласс UIView
:
let viewA: UIView = {...}
let viewB: UIView = {...}
let viewC: UIView = {...}
var subviews: [UIView]
class MyView: UIView {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init() {
subviews = [viewA, viewB, viewC]
super.init(frame: .zero)
abc123(true)
}
func abc123(_ cols: Bool) { ... }
...
}
Теперь я хочу сделать немного измененную версию myView
, но хочу сохранить большую часть логики. Поэтому чуть позже в файл добавляю:
class myAltView: MyView {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init() {
subviews = [viewA, viewC]
super.init(frame: .zero)
abc123(false)
}
}
Ошибка явно в super.init(frame: .zero)
подкласса.
Это не сработает, так как у super нет реализации для этого.
Я не могу вызвать super.super.init(frame: .zero)
, так как мне решить эту проблему?
Затем я начал переделывать «родительский класс», чтобы он содержал convenience init()
и init(subview: [UIView], cols: Bool)
, но снова мне не удалось успешно переопределить convenience init
в подклассе, который он хотел, чтобы я назвал self.init
, который я как раз пытался избежать определения в подклассе чтобы избежать избыточного кода.
Это должно быть проще, но я не могу придумать решение. Может ли кто-нибудь пролить свет на эту проблему...
Спасибо!
Если вы переопределите init(frame:)
в своем суперклассе и просто вызовете из него реализацию super
, не меняя, следовательно, его поведение, проблема будет решена.
class MyView: UIView {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect) {
super.init(frame: frame)
}
init() {
subviews = [viewA, viewB, viewC]
super.init(frame: .zero)
abc123(true)
}
func abc123(_ cols: Bool) {}
}
да - это сработало, просто нужно было указать
var subviews
значение по умолчанию и переместить строку нижеsuper.init
Спасибо!