2016-09-06 114 views
1

我有两个协议和两个类实现它们如下:协议的实施和继承

protocol IMessage { } 

class Message: IMessage { } 

protocol IConversation { 
    var messages: [IMessage] { get set } 
} 

class Conversation: IConversation { 
    var messages: [Message] = [] 
} 

有了这个代码,我得到了错误«型号‘对话’不符合协议IConversation»

+0

请不要在您的文章中更改声明,这会导致书面答案出现问题。 –

回答

1

问题在于IMessageMessage类型之间的差异。 IConversation协议期望您可以分配属性messages变量与任何类型的[IMessage],而不仅是案例[Message]。多一个类简单的例子:

class OtherMessage: IMessage { } 

通过协议声明你应该能够与[OtherMessage]类型分配变量messages和类Conversation不允许这样。修复:

class Conversation: IConversation { 
    var messages: [IMessage] = [] 
} 

更新:如果您需要Message类型的工作,你可以使用,例如,该解决方案:

class Conversation: IConversation { 
    var messages: [IMessage] {get{return _messages}set{_messages = newValue as! [Message]}} 
    var _messages: [Message] = [] 
} 

_messages内部类的工作。

+0

感谢您的回答。因此,如果我的类'Conversation'构建为仅与'Message'一起工作,那么我所能做的就是检查类型并在出现另一个'IMessage'的实现时抛出一个错误? – Morniak

+0

@Morniak基本上是。你可以在你的课堂上使用其他的财产(检查更新)。此外[这](http://stackoverflow.com/questions/38007881/swift-protocol-to-require-properties-as-protocol)问题可能是相关的 –

1

您的消息类型不匹配。您的协议需要[IMessage]类型的messages。你在课堂上用[Message]宣布它。