2017-02-06 33 views
0

Как решить в быстрой (2.0) следует, что случай: у нас есть два протокола:Наследование в быстрых протоколов

protocol SuperDelegate{ 
    func handleSuccess(rsp: BaseRsp) 
} 

protocol ChildOfSuperDelegate: SuperDelegate { 
    func handleSuccess(rsp: ChildOfBaseRsp) 
} 

и какое-то место в коде, где мы хотим сделать:

class A{ 
    var delegate:SuperDelegate? 

    func foo(){ 
     delegate?.handleSuccess(childOfBaseRspObj) 
    } 
} 

class Xyz:ChildOfSuperDelegate{ 
    func handleSuccess(rsp: ChildOfBaseRsp){ 
     print("Great!") 
    } 
} 

но компилятор не основав Наследование в протоколах (handleSuccess имеют функцию с базовыми и ребенком параметрами) есть ошибка компиляции:

Type 'Xyz' does not conform to protocol 'SuperDelegate' 

. Как их решить? Каков наилучший способ реализовать методы ChildOfSuperDelegate, но класс «A» использует переменную SuperDelegate.

Meybe Я должен использовать общие типы, чтобы иметь что-то вроде наследования в протоколах.

+0

Тип параметра отличается между протоколами параметров –

+0

Ну ваш 'delegate' говорит, что у него есть метод' handleSuccess' который принимает 'BaseRsp', но' Xyz' говорит, что он может * только * взять 'ChildOfBaseRsp'. Нельзя безопасно работать. 'Xyz' просто не удовлетворяет требованию' func handleSuccess (rsp: BaseRsp) '. – Hamish

+0

Я знаю. Но как их разрешить, у меня должен быть superDelegate и что-то вроде наследования в протоколах. Является ли generic Types хорошей идеей? – luky0007

ответ

0

Здесь ваш протокол ChildOfSuperDelegate наследуется от SuperDelegate, и хотя он является протоколом, он не реализует его методы. Но когда вы наследуете ChildOfSuperDelegate, вам необходимо реализовать метод SuperDelegate, а также ChildOfSuperDelegate.

Так что, как это:

class Xyz:ChildOfSuperDelegate{ 
    func handleSuccess(rsp: BaseRsp) { 
    //do stuff 
    } 

func handleSuccess(rsp: ChildOfBaseRsp){ 
    print("Great!") 
    } 
} 
+0

** Я это знаю. Это я не ищу **. Я хочу вызвать функцию протокола с poliformism, f.ex: 'delegate.handleSuccess (rspChildOfBaseRspObj) или delegate.handleSuccess (anotherChild)', но мой делегат - это объект, реализующий SuperDelegate (только). Поэтому вопрос в том, почему протоколы не имеют полиморфных методов и что такое walkarounds – luky0007

 Смежные вопросы

  • Нет связанных вопросов^_^