2017-09-05 19 views
0

커스텀 오브젝트로 세트를 생성하려고합니다. 이가 작동 , 내 정의의 세트가 중복이없는 개체를 사용하는 경우 :스위프트 | NSObject로 설정

public class AttributesGroup: Hashable, Equatable, Comparable { 

    open var id: Int! 
    open var name: String! 
    open var position: Int! 

    public init (id: Int = 0, name: String = "", position: Int = 0) { 
     self.id = id 
     self.name = name 
     self.position = position 
    } 

    open var hashValue: Int { 
     get { 
      return id.hashValue 
     } 
    } 

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool { 
     return lhs.id == rhs.id 
    } 

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool { 
     return lhs.position < rhs.position 
    } 
} 

NSObject의 이미 나는 hashValue를 오버라이드 (override) 할 필요가 해쉬 프로토콜 (또한 Equatable)를 구현하기 때문에 내가 NSObject의 내 클래스를 확장, 그리고 더 이상 작동하지 않습니다, 내 사용자 정의 개체의 집합을 사용하는 경우 중복, 여기에 내가 뭘 잘못합니까? :

public class AttributesGroup: NSObject, Comparable { 

    open var id: Int! 
    open var name: String! 
    open var position: Int! 

    public init (id: Int = 0, name: String = "", position: Int = 0) { 
     self.id = id 
     self.name = name 
     self.position = position 
    } 

    open override var hashValue: Int { 
     get { 
      return id.hashValue 
     } 
    } 

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool { 
     return lhs.id == rhs.id 
    } 

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool { 
     return lhs.position < rhs.position 
    } 
} 

당신의 도움에 감사드립니다!

+0

항상 그렇듯이, ** 옵션은 값을 가지지 않는'init' 메소드로 초기화되는 암시 적 래핑되지 않은 옵션으로 속성을 선언하지 않습니다. 불행히도 많은 * 끔찍한 * 자습서는이 * 끔찍한 습관을 제안합니다. 절대 그렇게하지 마십시오. 느낌표를 제거하십시오. – vadian

+0

비교 포인트 # 2 https://stackoverflow.com/a/42286148/2976878뿐만 아니라 https://stackoverflow.com/q/33319959/2976878 – Hamish

+0

@vadian 당신은 완전히 옳습니다, 이것은 나쁜 습관입니다. 감사. – Aximem

답변

1

NSObject는 코코아 유형입니다. NSObject의 규칙은 Swift의 규칙과 다릅니다. NSObject가 세트에서 작동하게하려면 hash의 구현과 일치하여 isEqual의 구현이 있어야합니다.

+0

실제로 isEqual 및 hash 구현과 함께 작동합니다. 감사 – Aximem