我有一个协议,我用它来定义构成注释内容的内容。注释可以有许多不同的内容类型,因此协议似乎是最好的方法。
public protocol Content {
var contentType: String { get }
}
然后我有了该协议的实现
public class PlainTextContent: Content {
public var contentType: String {
return "Plain Text"
}
public var text: String = String()
public init(content: String) {
self.text = content
}
}
这是两个对象的简化示例。接下来,我有一个Note
类,其中包含Array
个Content
协议实现。
public class Note {
public private(set) var noteContent: [Content] = []
public var title: String = String()
public var date: NSDate
public init() {
self.date = NSDate()
}
func insertContent(content: Content) -> Bool {
if contains(self.noteContent, content) {
return false
}
self.noteContent.append(content)
return true
}
func deleteContent(content: Content) -> Bool {
return false
}
}
我遇到的问题是当我做的时候
if contains(self.noteContent, content) {}
编译器告诉我
Note.swift:21:12:无法找到'包含'接受类型'([内容],内容)'
的参数列表
我在few examples看了Stackoverflow,我正在表现出来。我是如何定义协议的,以便将它用作数组和相关的全局函数?
我还试图让协议继承自Equatable
,此时我得到以下编译器错误
协议'内容'只能用作通用约束,因为它具有Self或关联类型要求
我对如何对协议数组执行相等性检查感到有些困惑。这是Swift不支持的东西吗?我来自C#背景,所以不确定Swift如何完全处理协议。
答案 0 :(得分:1)
您可以使用map
来取消装箱您的等值:
func insertContent(content: Content) -> Bool {
if contains(self.noteContent.map({$0.contentType}), content.contentType) {
return false
}
self.noteContent.append(content)
return true
}
希望这有帮助。