В последнее время я экспериментировал с созданием представлений iOS с помощью трюка, который я узнал от René Cacheaux , чтобы легко инициализировать UIViewControllers из кода:
class NiblessViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable, message: "Loading this view controller from a nib is unsupported.")
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
@available(*, unavailable, message: "Loading this view controller from a nib is unsupported.")
required init?(coder aDecoder: NSCoder) {
fatalError("Loading this view controller from a nib is unsupported")
}
}
Затем вы можете наследовать от NiblessViewController
в ваших пользовательских классах контроллера представления без необходимости каждый раз переопределять инициализатор:
class CustomViewController: NiblessViewController {
// ...
}
Это прекрасно работает при работе с ванилью UIViewController
, но я не могу найти хороший способ использовать его с другими классами контроллера представления (например, UITableViewController
, UINavigationController
) без создания отдельного Nibless
класс для каждого типа контроллера представления (например, NiblessTableViewController
, NiblessNavigationController
), содержащий точно такой же код.
Я попытался использовать расширение протокола, например, так:
protocol Nibless {}
extension Nibless where Self: UIViewController {
// Same initialization code as above
}
Делая это таким образом, я получаю три ошибки, говорящие:
- 'super' нельзя использовать вне класса
- 'обязательный' инициализатор в не-классе типа 'NiblessViewController'
- инициализатор не переопределяет указанный инициализатор из своего суперкласса
Есть идеи, как сделать это без дубликата кода?