2017-01-12 6 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

메서드를 일반 (두 번)으로 만들 필요가 없습니다. 이미 일반적인 클래스 안에 있으며 T 유형을 알고 있습니다. 타입 선언에 T: Equatable을 요구하는 것이 옳습니다.

은 메서드가 아니기 때문에 작동하지만 독립 실행 형 제네릭 함수입니다.

+0

와우, 유형 매개 변수는 서로를 어둡게 할 수 있습니까? 어머. O.O FWIW : [SR-1420] (https://bugs.swift.org/browse/SR-1420). – Raphael