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

これは、2 つのオブジェクトの単純化された例です。次に、プロトコルの実装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: タイプ '([Content], Content)' の引数リストを受け入れる 'contains' のオーバーロードが見つかりません

私はStackoverflowでいくつかの例を見てきましたが、それらが示すようにやっています。プロトコルを配列および関連するグローバル関数として使用するためにプロトコルを定義する方法に問題はありますか?

編集

また、プロトコルを から継承しようとしましたが、Equatableその時点で次のコンパイラ エラーが発生します。

プロトコル 'Content' は、Self または関連する型の要件があるため、一般的な制約としてのみ使用できます

一連のプロトコルに対して等価性チェックを実行する方法について、少し混乱しています。それは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 に答える