Intereting Posts
Не удалось создать Podfile, потому что «файл plist по пути не существует» UImapview: использование lat и lon как вычислять скорость в obj c Лучше ли повторно использовать контроллеры представлений или лучше отделить логику UIButton установил изображение и название Проблемы с обновлением UITableView показать название вместо сегмента управления, когда кнопка нажата ios NSManagedObject, реализующий протокол – Предупреждения из-за @dynamic Программировать максимальное разрешение изображения с использованием AVCaptureSession Помещение массива в ярлык быстрым Xcode 5 codeign хочет подписать с помощью клавиши "<key>" Быстро: возможно ли избежать доступа к Facebook SDK 4.x «Вы уже авторизовались для этого приложения» при входе в систему? Тип аргумента '' Не соответствует ожидаемому типу 'Hashable' Как получить изменение цвета UIButton при касании Каков правильный способ использования библиотеки, установленной с помощью CocoaPods? Как хорошая динамика обеспечивает NSURLConnection?

Дополнительные методы в протоколе 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:"

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

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».