2016-01-10 18 views
9

Tôi đã bắt đầu học nhanh chóng sau Java. Trong Java, tôi có thể sử dụng bất kỳ đối tượng nào làm khóa cho HashSet, vì nó có mặc định là hashCodeequals dựa trên số nhận dạng đối tượng. Làm thế nào để đạt được cùng một hành vi trong Swift?Swift, cách triển khai giao thức Hashable dựa trên tham chiếu đối tượng?

+1

Đây có phải là những gì bạn đang tìm kiếm http://stackoverflow.com/questions/30345700/reference-as-key-in-swift-dictionary? –

Trả lời

21

Nếu bạn đang làm việc với các lớp và không phải cấu trúc, bạn có thể sử dụng cấu trúc ObjectIdentifier. Lưu ý rằng bạn cũng phải xác định == cho lớp học của mình để phù hợp với Equatable (yêu cầu Hashable). Nó sẽ trông giống như sau:

class MyClass: Hashable { } 

func ==(lhs: MyClass, rhs: MyClass) -> Bool { 
    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) 
} 

class MyClass: Hashable { 
    var hashValue: Int { 
     return ObjectIdentifier(self).hashValue 
    } 
} 
1

Tất cả tín dụng cho answer. Biến nó thành một lớp cơ sở để có thể sử dụng lại, có thể giúp ai đó! Tất cả các công cụ bổ sung, như open, là để bạn có thể đặt điều này trong một thành phần khung cơ sở có thể tái sử dụng.

open class HashableClass { 
    public init() {} 
} 

// MARK: - <Hashable> 

extension HashableClass: Hashable { 
    public var hashValue: Int { 
     return ObjectIdentifier(self).hashValue 
    } 
} 

// MARK: - <Equatable> 

extension HashableClass: Equatable {} 
public func ==(lhs: HashableClass, rhs: HashableClass) -> Bool { 
    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) 
} 

Để sử dụng, chỉ cần đưa lớp học và phân lớp của bạn HashableClass, sau đó mọi thứ chỉ hoạt động!

class MyClass: HashableClass { 

} 
Các vấn đề liên quan