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à hashCode
và equals
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?
9
A
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
- 1. Nơi triển khai giao thức Swift?
- 2. Tham chiếu đến tất cả các giao thức Swift?
- 3. Riêng tư triển khai giao thức?
- 4. Làm cách nào để tìm các giao thức được triển khai trong đối tượng Clojure?
- 5. Cách triển khai đúng giao thức ánh xạ trong Python?
- 6. Kiểm tra xem phương thức giao thức tùy chọn có được triển khai trong Swift không?
- 7. Cách triển khai tính tham chiếu trong C?
- 8. Viết một thực hiện Hashable tốt trong Swift
- 9. Cài đặt và giao thức trong Swift
- 10. HTML 5 Tham chiếu Triển khai
- 11. Các tham chiếu yếu được triển khai như thế nào?
- 12. Triển khai hàng đợi dựa trên tệp
- 13. in_array trên các đối tượng có tham chiếu vòng tròn
- 14. Làm cách nào để triển khai giao thức mạng?
- 15. java.lang.NullPointerException: Cố gắng gọi phương thức ảo 'int android.view.View.getImportantForAccessibility()' trên tham chiếu đối tượng null
- 16. Tự động thay thế triển khai phương thức trên một đối tượng trong Ruby
- 17. Cố gắng gọi phương thức ảo 'java.lang.Class java.lang.reflect.Field.getType()' trên tham chiếu đối tượng null
- 18. cách chuyển đối tượng Swift Struct thành tham số cho phương thức Objective-C
- 19. Làm cách nào bạn có thể chuyển Danh sách <đối tượng triển khai giao diện> sang phương thức?
- 20. java.lang.Class java.lang.Object.getClass() 'trên tham chiếu đối tượng null
- 21. Android: java.lang.NullPointerException: Cố gắng gọi phương thức ảo 'java.lang.String java.lang.Object.toString()' trên tham chiếu đối tượng null
- 22. Vấn đề tham chiếu giao thức Swift tự mở rộng với init
- 23. Vectơ tham chiếu đến các đối tượng
- 24. Mùa xuân - cách thức triển khai giao diện bê tông?
- 25. Cố gắng gọi phương thức ảo 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' trên tham chiếu đối tượng null
- 26. Triển khai Hàng đợi dựa trên FIFO?
- 27. Dagger 2 - Giao diện tiêm trong lớp thực hiện - "Cố gắng gọi phương thức giao diện trên tham chiếu đối tượng rỗng"
- 28. Tôi có thể bỏ một đối tượng metaclass vào một loại giao thức trong Swift không?
- 29. Tham chiếu phương thức với đối số
- 30. Cố gắng gọi phương thức ảo 'android.content.Context.getResources()' trên tham chiếu đối tượng rỗng
Đâ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? –