Ich habe ein Ray Wenderlich-Tutorial durchgearbeitet und festgestellt, dass der Autor Klassenerweiterungen verwendet, um Rückrufe von Stellvertretern zu speichern, anstatt sie in der Klasse selbst behandeln zu lassen, dh:
Rückrufe innerhalb der Klassenerweiterung delegieren:
extension LogsViewController : UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
...
}
}
im Gegensatz dazu, dass es in der Klasse enthalten ist:
Rückrufe innerhalb der Klasse delegieren:
class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
...
}
}
Ich fand das seltsam und interessant zugleich. Er hat eine Datei, die nur den Erweiterungen in der LogsViewController-Klasse namens "LogsViewControllerExtension.swift" gewidmet ist, und hat für jedes Delegate-Protokoll eine andere Erweiterung: UITableViewDataSource, UISplitViewDelegate usw. Dh:
mehrere Klassenerweiterungen, die jeder mit Rückrufen in seiner eigenen Datei delegiert:
extension LogsViewController: UISplitViewControllerDelegate {
... callbacks
}
extension LogsViewController : UIPopoverPresentationControllerDelegate {
... callbacks
}
Warum?
Welche Vorteile bringt dies? Ich kann sehen, wo es vielleicht ein bisschen lesbarer ist, dies zu trennen, aber gleichzeitig ist es eine Ebene der Indirektion. Gibt es OO-Prinzipien, die dies unterstützen oder ablehnen?