1

私は Node と呼ばれる Swift で柔軟なデータ構造を構築することに取り組んでおり、それ自体はどのタイプのコンテンツにも結び付けられていません。ただし、ノード内のペイロード データは、Equatable プロトコルに準拠する次の汎用 Element 構造体として宣言されます。

public struct Element<T>: Equatable {
  var data: T;
}

public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool {
    return lhs.data == rhs.data;
}

制約は、Element が同等のクラス タイプに関連付けられている必要があることです。私が抱えている問題は、この要素を含むノードにあります。ノードは、ディクショナリ、配列、またはその他のコンテナ タイプで使用されます。ここに私が持っているものがあります:

public class Node: Equatable {

    var payload: Element<AnyObject>

    init(_data: Element<AnyObject>) {
        self.payload = _data
    }

}

public func ==(lhs: Node, rhs: Node) -> Bool {
    return lhs.payload == rhs.payload;
}

もちろん、AnyObject が Equatable に準拠していないというエラーが表示されます。ペイロードの宣言を等価なオブジェクトのみに制限する方法はありますか? この時点では、ペイロードに格納される可能性があるオブジェクトの種類はわかりません。

また、Node の == 関数にクラス チェックを配置して、2 つの Node ペイロードが互換性があることを確認して比較する必要があることに気付きました。

考え?ありがとうございました!

4

1 に答える 1

2

payloadである型に制約するには、その制約を渡すことができるようにジェネリック クラスであるEquatable必要があります。Node

クラス宣言で制約を指定できます。

public class Node<T: Equatable>: Equatable {...}

次に、ペイロードを宣言するときに、要素タイプを T だけに設定できます。

var payload: Element<T>

コードをテストするとき、Element のジェネリック制約 T も Equatable に準拠させる必要がありました。参照用のコード全体:

public struct Element<T: Equatable>: Equatable {
    var data: T
}

public func ==<T:Equatable>(lhs: Element<T>, rhs: Element<T>) -> Bool {
    return lhs.data == rhs.data
}

public class Node<T: Equatable>: Equatable {
    var payload: Element<T>
    init(_data: Element<T>) {
        self.payload = _data
    }
}

public func ==<T: Equatable>(lhs: Node<T>, rhs: Node<T>) -> Bool {
    return lhs.payload == rhs.payload
}

これにより、次の結果が生成されます。

Node(_data: Element(data: 1)) == Node(_data: Element(data: 1)) // true
Node(_data: Element(data: 1)) == Node(_data: Element(data: 2)) // false
于 2016-09-13T01:29:05.130 に答える