2016-08-12 1 views
5

У меня есть быстрый код:Swift наследования протокол

import Foundation 

protocol ParentProtocol { 
    //stuff 
} 

protocol ChildProtocol:ParentProtocol { 
    //additional stuff 
} 

protocol FooProtocol { 
    var variable:ParentProtocol? { get } 
} 

class Foo:FooProtocol { 
    var variable:ChildProtocol? 
} 

Я получил сообщение об ошибке компилятора: Type 'Foo' does not conform to protocol 'FooProtocol'

Я знаю, что в соответствии с FooProtocol, тип переменной должен быть ParentProtocol типа. С другой стороны, ChildProtocol наследует от ParentProtocol, поэтому он также является ParentProtocol

Есть ли какое-либо решение для использования наследования протокола таким образом?

+0

@ShadowOf Угу, спасибо. Решение со связанными типами работает так, как ожидалось: http://stackoverflow.com/a/38008288/824285 – somedev

+0

Связанный: [Как я могу создать функцию с типом возврата подкласса, совместимым с протоколом, где Superclass определяется как тип возврата ?] (http://stackoverflow.com/questions/35094967/swift-how-can-i-make-a-function-with-a-subclass-return-type-conform-to-a-protoc) – Hamish

+1

Также связанные (соответствие и наследование метатипов): [Протокол не соответствует самому себе?] (http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself), цитируя комментарий MartinR: s, _ " Даже с 'протоколом P: Q {}', 'P' не соответствует' Q'' _. – dfri

ответ

2

Я нашел решение с соответствующими типами (https://stackoverflow.com/a/38008288/824285)

В моем случае это будет:

protocol FooProtocol { 
    associatedtype T = ParentProtocol 
    var variable:T? { get } 
} 
+1

Обратите внимание, что в классе, который соответствует этому протоколу, 'T' может фактически стать любым типом, а не только' ParentProtocol' или его дочерний элемент 'String', например. –