2

我有一个协议,用于定义构成笔记内容的内容。一个便笺可以有许多不同的内容类型,因此协议似乎是最好的方法。

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:找不到接受类型为“([内容],内容)”的参数列表的“包含”的重载

我在Stackoverflow上查看了一些示例,并且正在按照他们的说明进行操作。我如何定义协议以便将其用作数组和相关的全局函数是否存在问题?

编辑

我还尝试使协议继承自Equatable,此时我收到以下编译器错误

协议“内容”只能用作通用约束,因为它具有自身或相关类型要求

对于如何对协议数组执行相等性检查,我有点困惑。这是 Swift 不支持的东西吗?我来自 C# 背景,所以不确定 Swift 如何完全处理协议。

4

1 回答 1

1

您可以使用map取消装箱您的等价值:

func insertContent(content: Content) -> Bool {
        if contains(self.noteContent.map({$0.contentType}), content.contentType) {
            return false
        }

        self.noteContent.append(content)
        return true
    }

希望这可以帮助。

于 2015-06-11T04:11:03.893 回答