2017-01-12 8 views
1

現在、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のようなすべての回答は疑問を解決しません。前もって感謝します!

+0

'LinkedList'や' ListNode'の実際の宣言で 'T'を' Equatable'に制限する必要はないことに注意してください(リンクリストは 'Equatable'要素を持たない*)。拡張子 'where T:Equatable'を実装し、そこに' contains'関数を定義する方が良い(stdlibと同様に、制約のない 'T'の述語バージョンを定義することもできます)。 – Hamish

+0

これは、 'LinkedList'を' Sequence'や 'Collection'に準拠させる方が良いでしょう。あなたは無料でこのすべてを(さらにはるかに)得ることができます。 – Hamish

答えて

1

containsメソッドを汎用(2回)にする必要はありません。すでに一般的なクラスの中にあり、Tタイプを知っています。型宣言にはT: Equatableが必要です。

findIndex(of:in:)は、メソッドではなくスタンドアロンの汎用関数であるため、そのまま動作します。

+0

うわー、タイプパラメータはお互いに影を付けることができますか?ああ、私。 O.O FWIW:[SR-1420](https://bugs.swift.org/browse/SR-1420)。 – Raphael