現在、LinkedListのような基本的なデータ構造を試しています。私はListNodeクラスのジェネリックス値を次のように定義しました:タイプTの値の等価性をチェックできません:汎用の内部の等価性
class ListNode<T> {
var nodeContent: T
var nextNode: ListNode<T>? = nil
init() {
// details omitted here
}
そしてリンクリスト。私は含まれています()メソッドを実装したいので、私はこのようなsthは持っている:
func contains<T>(_ item: T) -> Bool {
var currNode = self.head
while (currNode != nil) {
if currNode?.nodeContent == item {
return true
}
currNode = currNode?.nextNode
}
return false
}
が、それは私に「==」TとTタイプに適用することができないというエラーを与えているし。私は、言語のガイドを介して見て、これにListNodeクラスとLinkedListの構造体を変更:
class ListNode<T: Equatable>{}
struct LinkedList<T: Equatable>{}
をしかし、それは働いていないので、私は自分自身をFUNCには「Equatable」を追加しました:
func contains<T: Equatable>(_ item: T) -> Bool
はまだ失敗します。
func findIndex<T: Equatable>(of valueToFind: T, in array:[T]) -> Int? {
for (index, value) in array.enumerated() {
if value == valueToFind {
return index
}
}
return nil
}
エラーは発生しません。なぜそれがこのようなのか分かりますか?私は検索しましたが、thisのようなすべての回答は疑問を解決しません。前もって感謝します!
'LinkedList'や' ListNode'の実際の宣言で 'T'を' Equatable'に制限する必要はないことに注意してください(リンクリストは 'Equatable'要素を持たない*)。拡張子 'where T:Equatable'を実装し、そこに' contains'関数を定義する方が良い(stdlibと同様に、制約のない 'T'の述語バージョンを定義することもできます)。 – Hamish
これは、 'LinkedList'を' Sequence'や 'Collection'に準拠させる方が良いでしょう。あなたは無料でこのすべてを(さらにはるかに)得ることができます。 – Hamish