Đâu là điểm khác biệt giữa setObject: forKey: và setValue: forKey: trong NSMutableDixi?


153

Khi nhìn vào tài liệu, tôi hầu như không thấy bất kỳ sự khác biệt lớn nào. Cả "giá trị" và "đối tượng" đều thuộc loại id , vì vậy có thể là bất kỳ đối tượng nào. Khóa là một chuỗi, và trong trường hợp khác là id. Một trong số họ dường như giữ lại đối tượng, còn người kia thì không. Còn gì nữa không Cái nào dùng cho trường hợp nào?


Câu trả lời:


163

setValue:forKey:là một phần của giao thức NSKeyValueCoding , trong số những thứ khác, cho phép bạn truy cập các thuộc tính đối tượng từ giao diện của Trình tạo giao diện. setValue:forKey:được thực hiện trong các lớp khác NSDictionary.

setObject:forKey:NSMutableDictionary'slý do để tồn tại. Chữ ký của nó xảy ra khá giống với setValue: forKey:, nhưng chung chung hơn (ví dụ: bất kỳ loại khóa nào). Có một sự trùng hợp ngẫu nhiên là chữ ký rất giống nhau.

Điều làm tăng thêm sự nhầm lẫn là việc triển khai của NSMutableDipedia setValue:forKey:tương đương với setObject:forKey:hầu hết các trường hợp. Trong các lớp khác, setValue:forKey:thay đổi các biến thành viên. Trong NSMutableDictionaryđó, nó thay đổi các mục từ điển, trừ khi bạn đặt tiền tố khóa bằng ký tự '@' - trong trường hợp đó, nó sửa đổi các biến thành viên.

Vì vậy, một cách ngắn gọn, hãy sử dụng setObject:forKey:khi bạn cần làm việc với các khóa và giá trị từ điển và setValue:forKey:trong các trường hợp hiếm hơn khi bạn cần giải quyết KVP .

EDIT: và oh, có vẻ như điều này đã được hỏi và trả lời trước: Sự khác biệt giữa objectForKey và valueForKey?


câu hỏi đó không hoàn toàn giống nhau đó là về các phương thức getter, trong khi câu hỏi này là về các phương thức setter
user102008

1
Ý của bạn là gì trong "Trong NSMutableDixi, nó thay đổi các mục từ điển, trừ khi bạn đặt tiền tố khóa bằng ký tự '@' - trong trường hợp đó nó sửa đổi các biến thành viên." Biến thành viên nào? Ngoài ra, có lẽ bạn có thể nhận xét về stackoverflow.com/questions/5755917 ? Cảm ơn.
Peter tibraný

chỉ để hoàn thiện, setObject: forKey sẽ tăng (ngoại lệ) nếu đối tượng là nil. SetValue: forKey sẽ hoạt động giống nhau, hoặc nó sẽ xóa đối tượng hiện có khỏi từ điển khi đặt nil cho khóa?
Motti Shneor

Câu trả lời chính xác. Có thật không. mặc dù vậy, sẽ rất tốt nếu đề cập rằng (ít nhất là trên NSMutableDixi) setValue: forKey: chấp nhận các giá trị nil và xóa mục nhập - trong khi setObject: forKey: sẽ ném ngoại lệ và sụp đổ khi trao các giá trị nil.
Motti Shneor

83

Một sự khác biệt nữa là nếu bạn đưa ra một giá trị không setValue:forKey:, nó sẽ xóa khóa khỏi từ điển nếu nó tồn tại, nếu không thì không có gì. Nhưng nếu bạn đưa ra một giá trị không setObject:forKey:, nó sẽ tạo ra một ngoại lệ.


10
Điều này là siêu hữu ích để biết. Tôi đã viết danh mục riêng của mình trên NSMutableDixi để thực hiện chính xác điều này!. Cảm ơn
Arman

2
Một sự khác biệt nữa là với tính năng đăng ký mục tiêu-c, bạn có thể viết dic[key] = value;để hỗ trợ xóa khóa nếu giá trị là nil. Đăng ký nói chung là một cách tiếp cận tốt hơn setValue:forKey:để thực hiện điều này.
Cœur


4

anObject - Giá trị cho khóa. Đối tượng nhận được một tin nhắn giữ lại trước khi được thêm vào NSDictionary. Giá trị này không được bằng không.

aKey - Chìa khóa cho giá trị. Khóa được sao chép (sử dụng copyWithZone:; các khóa phải tuân theo NSCopyinggiao thức). Chìa khóa không được bằng không.

value - Giá trị cho khóa.

key - Chìa khóa cho giá trị. Lưu ý rằng khi sử dụng mã hóa khóa-giá trị, khóa phải là một chuỗi (xem Mã khóa cơ bản mã hóa giá trị cơ bản).


Cảm ơn bạn đã đưa ra lý do chính đáng tại sao setObject: forKey: đưa ra một ngoại lệ. @b [reehg
simbesi.com 27/05/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.