2016-08-12 139 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类型。在另一方面,从ParentProtocolChildProtocol继承,所以它也是一个ParentProtocol

是否有任何解决方案中使用的协议基业呀?

+0

@ShadowOf是的,谢谢。与相关类型的解决方案按预期工作:http://stackoverflow.com/a/38008288/824285 – somedev

+0

相关:[我怎样才能使一个函数与一个子类返回类型符合协议,其中一个超类定义为返回类型?](http://stackoverflow.com/questions/35094967/swift-how-can-i-make-a-function-with-a-subclass-return-type-conform-to-a-protoc) – Hamish

+1

也相关(metatypes的一致性和继承性):[协议不符合自己?](http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-it-自己),引用MartinR:s评论,_“即使使用'protocol 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”。 –