Intereting Posts
Сделайте SKAction с селектором селектора, но с параметрами Возможно ли перенаправить системный API в Objective-C? Как использовать инфраструктуру Core-Plot для iOS в Xcode 4.2? kCLErrorDomain Code = 8 "Операция не может быть завершена. Обновление перенесенного приложения iOS Как визуализировать PDF-формы для заполнения пользователем? Как Apple улавливает корпоративные приложения, распределенные вне корпорации? Создание пользовательского элемента ASP.Net в системе iOS IOS 11 Drag'n'Drop Как удалить пользовательский файл If-Modified-Since запрос в iOS startFirstResponder: автоматически прокручивается до UIControl, который становится первым ответчиком Почему AVPlayer запрашивает несколько диапазонов соединений в одном сеансе? Этот пакет недействителен. Новые обновления приложений и приложений, представленные в хранилище приложений, должны быть построены с помощью xcode 5 и ios 7 sdk Соглашение об именах объектов данных ядра Управление памятью ARC и контроллеры просмотра

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