Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 协议实现与继承_Swift - Fatal编程技术网

Swift 协议实现与继承

Swift 协议实现与继承,swift,Swift,我有两个协议和两个类实现它们,如下所示: protocol IMessage { } class Message: IMessage { } protocol IConversation { var messages: [IMessage] { get set } } class Conversation: IConversation { var messages: [Message] = [] } 使用此代码,我得到错误«类型“对话”不符合协议IConversation

我有两个协议和两个类实现它们,如下所示:

protocol IMessage { }

class Message: IMessage { }

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

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

使用此代码,我得到错误«类型“对话”不符合协议IConversation»

您的消息类型不匹配。您的协议需要类型为
[IMessage]
消息。您正在使用
[Message]
在类中声明它问题在于
IMessage
Message
类型之间存在差异
IConversation
协议期望您能够使用任何类型的
[IMessage]
为属性
消息
变量赋值,而不仅仅是大小写
[Message]
。还有一个类的简单示例:

class OtherMessage: IMessage { }
通过协议声明,您应该能够将类型为
[OtherMessage]
的变量分配给
消息
,并且类
会话
不允许这样做。修复它:

class Conversation: IConversation {
    var messages: [IMessage] = []
}
更新:如果需要使用
消息
类型,可以使用以下解决方案:

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

并在课堂内处理
\u消息

请不要更改您帖子中的声明,这会导致书面答案出现问题。谢谢您的回答。因此,如果我的类
对话
仅用于
消息
,我所能做的就是检查类型,如果是
IMessage
的另一个实现,则抛出一个错误?@Morniak基本上是的。您可以在类中使用其他属性(检查更新)。这个问题也可能是相关的