Tài liệu cho -hash
nói rằng nó không được thay đổi trong khi đối tượng có thể thay đổi được lưu trữ trong bộ sưu tập, và tài liệu tương tự cho -isEqual:
nói giá trị -hash
phải giống nhau.Các kỹ thuật để thực hiện -hash trên các đối tượng Cacao có thể thay đổi
Với điều này, không ai có bất kỳ đề xuất nào về cách tốt nhất để triển khai -hash
sao cho nó đáp ứng cả hai điều kiện này nhưng thực sự được tính toán thông minh (tức là không chỉ trả lại 0
)? Có ai biết làm thế nào các phiên bản có thể thay đổi của các lớp khung cung cấp làm điều này? Điều đơn giản nhất là chỉ cần quên điều kiện đầu tiên (về nó không thay đổi) và chỉ cần chắc chắn rằng tôi không bao giờ vô tình biến đổi một đối tượng trong khi nó trong một bộ sưu tập, nhưng tôi tự hỏi nếu có bất kỳ giải pháp đó là nhiều hơn nữa Linh hoạt.
EDIT: Tôi tự hỏi ở đây liệu có thể duy trì 2 hợp đồng hay không. trạng thái của đối tượng. Độ nghiêng của tôi là để nói "không", trừ khi tôi làm điều gì đó ngu ngốc như luôn luôn trả về 0 cho băm, nhưng đó là lý do tại sao tôi hỏi câu hỏi này.
đoán đây là một câu hỏi cũ, chỉ tìm thấy nó ... nhưng không phải là đối tượng có thể thay đổi được sử dụng làm khóa trong bộ sưu tập thường được sao chép? Điều đó không chỉ cản trở vấn đề? – nielsbot
@nielsbot: Chỉ các khóa cho NSDictionaries mới được sao chép. NSSet không sao chép các đối tượng của nó và API 'CFDictionarySetValue()' cũng không sao chép khóa của nó. –
'CFDictionarySetValue' sẽ làm gì nếu bạn chuyển' kCFTypeDictionaryKeyCallbacks' thành 'CFDictionaryCreate', không? Các tài liệu gần như không nhạy cảm ... Tôi cho rằng một bộ sưu tập có thể thay đổi obj có thể, uh, cache các giá trị băm, giống như giả định một obj có thể thay đổi trong một bộ sưu tập sẽ không thay đổi giá trị băm của nó, đúng không? – nielsbot