2016-09-06 112 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]宣佈它。