현재 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