2017-02-22 13 views
1

내가 만든 구조체와 값을 Ints의 배열로 사용하여 키로 사전을 만들려고합니다. 그러나 오류가 계속 발생합니다 : Type 'dateStruct' does not conform to protocol 'Hashable'. 나는 필요한 메소드를 구현 했음에도 불구하고 여전히 작동하지 않는다고 확신한다. 여기 내 구조체 구현 된 프로토콜이다 :Hashable 프로토콜을 준수합니까?

struct dateStruct { 
    var year: Int 
    var month: Int 
    var day: Int 

    var hashValue: Int { 
     return (year+month+day).hashValue 
    } 

    static func == (lhs: dateStruct, rhs: dateStruct) -> Bool { 
     return lhs.hashValue == rhs.hashValue 
    } 

    static func < (lhs: dateStruct, rhs: dateStruct) -> Bool { 
     if (lhs.year < rhs.year) { 
      return true 
     } else if (lhs.year > rhs.year) { 
      return false 
     } else { 
      if (lhs.month < rhs.month) { 
       return true 
      } else if (lhs.month > rhs.month) { 
       return false 
      } else { 
       if (lhs.day < rhs.day) { 
        return true 
       } else { 
        return false 
       } 
      } 
     } 
    } 
} 

는 아무도 나에게 설명해 주시겠습니까 나는 여전히 오류를 받고 있어요 이유는 무엇입니까?

답변

9

당신은 선언을 놓치고 :

struct dateStruct: Hashable { 

이 BTW - 구조체와 클래스 이름은 대문자로 시작해야합니다.

그리고 == 기능이 잘못되었습니다. 세 가지 특성을 비교해야합니다.

static func == (lhs: dateStruct, rhs: dateStruct) -> Bool { 
    return lhs.year == rhs.year && lhs.month == rhs.month && lhs.day == rhs.day 
} 

두 값이 동일한 해시 값을 가질 수 있습니다. 구조체를 정의 할 때

+0

감사합니다를! Btw, 왜'=='이 잘못 되었습니까? 같은 날짜, 월, 일을 가진 2 개의 날짜가 어쨌든 동일한 hashValue를 가지지 않습니까? – MarksCode

+0

물론 두 개의 동일한 날짜는 동일한 해시를 갖습니다. 그러나 동일한 해시를 가진 두 개의 날짜가 반드시 동일하지는 않습니다. 두 개의 서로 다른 날짜가 동일한 해시를 가질 수 있습니다. 괜찮아. 그러나 동일한 해시를 사용하는 두 개의 날짜가 동일 할 필요는 없습니다. – rmaddy

+0

글쎄, 혼란 스럽다. 어쨌든 2 개의 다른 날짜의 년, 월, 일이 2000, 1, 2, 2000, 2, 3과 같이 같은 것이 될 수 있기 때문에 어쨌든 내 반환 (year + month + day) .hashValue 만 충분하지 않다. 1? – MarksCode

1

당신은 해쉬 프로토콜을 지정하지 않았다 struct dateStruct: Hashable {...

다음 코드는 귀하의 예제에서이며이 놀이터에서 실행됩니다. 당신의 == 연산자가 여기 수정 된 있습니다 :

import Foundation 

struct dateStruct: Hashable { 
    var year: Int 
    var month: Int 
    var day: Int 

    var hashValue: Int { 
     return (year+month+day).hashValue 
    } 

    static func == (lhs: dateStruct, rhs: dateStruct) -> Bool { 
     return lhs.year == rhs.year && lhs.month == rhs.month && lhs.day == rhs.day 
    } 

    static func < (lhs: dateStruct, rhs: dateStruct) -> Bool { 
     if (lhs.year < rhs.year) { 
      return true 
     } else if (lhs.year > rhs.year) { 
      return false 
     } else { 
      if (lhs.month < rhs.month) { 
       return true 
      } else if (lhs.month > rhs.month) { 
       return false 
      } else { 
       if (lhs.day < rhs.day) { 
        return true 
       } else { 
        return false 
       } 
      } 
     } 
    } 
} 

var d0 = dateStruct(year: 2017, month: 2, day: 21) 
var d1 = dateStruct(year: 2017, month: 2, day: 21) 

var dates = [dateStruct:Int]() 
dates[d0] = 23 
dates[d1] = 49 

print(dates) 

print(d0 == d1) // true 

d0.year = 2018 

print(d0 == d1) // false