Problem is in difference between IMessage and Message types. IConversation protocol expect that you are able assign to property messages variable with any type of [IMessage], not only case [Message]. Simple example with one more class:
class OtherMessage: IMessage { }
By protocol declaration you should be able to assign variable with type [OtherMessage] to messages, and class Conversation don't allow this. Fix it:
class Conversation: IConversation {
var messages: [IMessage] = []
}
Update: if you need to work with Message type, you can use, for example, this solution:
class Conversation: IConversation {
var messages: [IMessage] {get{return _messages}set{_messages = newValue as! [Message]}}
var _messages: [Message] = []
}
and work with _messages inside class.