协议实例数组不能使用contains方法

时间:2015-06-11 03:50:32

标签: arrays swift xcode6.3 swift-protocols

我有一个协议,我用它来定义构成注释内容的内容。注释可以有许多不同的内容类型,因此协议似乎是最好的方法。

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类,其中包含ArrayContent协议实现。

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如何完全处理协议。

1 个答案:

答案 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
    }

希望这有帮助。