Intereting Posts
Выполнить код на экране запуска ОБНОВЛЕНО Как отображать интерфейс с гибким контентом в раскадровке Xcode setFrame работает на iOS7, но больше не работает на iOS6 изменяемый массив в 1 классе в двух действиях кнопки iOS: отбрасывание файла данных отладки с устройства на OSX Программно создайте subview, который охватывает 50% экрана iphone Как получить пользовательское значение TableViewCell на контроллере представления в объекте c Приложение для рисования с огромным холстом Получите значение строки агента пользователя AppleCoreMedia на iOS Как реализовать случайное решение Лесная классификация в iOS причина сбоя по предупреждению памяти iOS Обновление местоположения даже приложение не работает (например, найти мой iphone) Не удалось получить имя устройства сканера через Bluetooth на устройстве iOS Заставка для iPhone в качестве короткого видеоролика mp4 ERROR ITMS-90363 "Недопустимый ключ Info.plist. Ключ «CFBundleIcons ~ iPad в комплекте … недействителен».

Дополнительные методы в протоколе Swift и перегрузка

Есть ли способ переопределить дополнительные методы в протоколе Swift?

protocol Protocol { func requiredMethod() } extension Protocol { func optionalMethod() { // do stuff } } class A: Protocol { func requiredMethod() { print("implementation in A class") } } class B: A { func optionalMethod() { // <-- Why `override` statement is not required? print("AAA") } } 

Почему в UIKit есть подобный пример?

 protocol UITableViewDelegate : NSObjectProtocol, UIScrollViewDelegate { // ...... optional public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat } class MyTVC: UITableViewController { override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {} 

требуется инструкция override !!! Но UITableViewController не отвечает на селектор "tableView: estimatedHeightForRowAtIndexPath:"

Что проблема?

Solutions Collecting From Web of "Дополнительные методы в протоколе Swift и перегрузка"

UITableViewController – это класс, а не протокол. В протоколе вы можете объявить метод, который требуется вашему классу. Расширения протокола дают вам возможность писать стандартную реализацию вашего метода протокола, и даже если ваш класс «наследует» этот протокол, вам не нужно реализовывать этот метод, но вы можете изменить реализацию по умолчанию.

Если вы пишете код примерно так:

 protocol ExampleProtocol { func greetings() -> String } extension ExampleProtocol { func greetings() -> String { return "Hello World" } } class Example : ExampleProtocol { } 

то вы можете увидеть «Hello World» на консоли, но если вы повторно напишите этот метод в своем классе:

 func greetings() -> String { return "Hello" } 

теперь вы увидите только «Привет». Вы можете удалить этот метод из своего класса и удалить декларацию расширения протокола, а затем вы увидите ошибку: «Пример типа не соответствует протоколу ExampleProtocol».