2012-07-11 25 views
6

Sự khác nhau giữa forKey và forKeyPath trong phương thức setValue của NSMutableDicitionary là gì? Tôi nhìn cả hai trong tài liệu và họ dường như giống với tôi. Tôi đã thử mã sau, nhưng tôi không thể phân biệt sự khác biệt.Mục tiêu-C: Sự khác nhau giữa forKey và forKeyPath là gì?

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
[dict setValue:@"abc" forKey:@"ABC"]; 
[dict setValue:@"123" forKeyPath:@"xyz"]; 
for (NSString* key in dict) { 
    id val = [dict objectForKey:key]; 
    NSLog(@"%@, %@", key, val); 
} 
+2

Chỉ khác nếu bạn đang sử dụng một từ điển phức tạp hơn (với nhiều cấp độ). Lý do của bạn trông giống nhau là một keypath với chỉ một điều (không có '.' chỉ ra một thành phần đường dẫn bổ sung) thực sự chỉ là một khóa. – Dustin

Trả lời

7

Cả hai phương pháp này là một phần của Key-Value Coding và không nên thường được sử dụng để truy cập phần tử trong từ điển. Chúng chỉ hoạt động trên các loại khóa NSString và yêu cầu cú pháp cụ thể.

Sự khác biệt giữa cả hai trong số đó là việc chỉ định khóa (đơn) sẽ chỉ tìm kiếm mục đó.

Chỉ định một đường dẫn chính ngược lại theo đường dẫn qua các đối tượng. Nếu bạn có từ điển từ điển, bạn có thể tìm kiếm một phần tử ở cấp độ thứ hai bằng cách sử dụng một đường dẫn chính như "key1.key2".

Nếu bạn chỉ muốn truy cập các phần tử trong từ điển, bạn nên sử dụng objectForKey:setObject:forKey:.

Sửa để trả lời tại sao valueForKey: không nên được sử dụng:

  1. valueForKey: chỉ hoạt động cho các phím chuỗi. Từ điển có thể sử dụng các đối tượng khác cho khóa.
  2. valueForKey: Xử lý các phím bắt đầu bằng ký tự "@" khác nhau. Bạn không thể truy cập các yếu tố có khóa bắt đầu bằng @.
  3. Quan trọng nhất: Bằng cách sử dụng valueForKey: bạn đang nói: "Tôi đang sử dụng KVC". Nên có một lý do để làm điều này. Khi sử dụng objectForKey:, bạn chỉ truy cập các phần tử trong từ điển thông qua API tự nhiên, dự định.
+0

Chỉ vì tò mò, lý do 'valueForKey:' không nên được sử dụng với từ điển là gì? – Monolo

+0

@Monolo Xem chỉnh sửa. –

3

của Apple Tài liệu: NSKeyValueCoding Protocol Reference

setValue: forKey:

Thiết lập tài sản của người nhận theo quy định của một chìa khóa trao cho một giá trị nhất định.

Ví dụ:

[foo setValue:@"blah blah" forKey:@"stringOnFoo"]; 

setValue: forKeyPath:

Thiết lập giá trị cho thuộc tính xác định bởi một con đường quan trọng cho một giá trị nhất định.

Ví dụ:

[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"]; 
+1

Ngoài ra, khi sử dụng "setValue: forKeyPath:" hãy chắc chắn rằng đối tượng tại keyPath tồn tại. Nếu nó là nil, phương thức sẽ âm thầm thất bại vì đường dẫn không đầy đủ. – ezekielDFM

1

keyPath có thể được sử dụng để đi qua các đường đối tượng tùy ý, miễn là chúng triển khai NSKeyValueCoding. Họ không cần phải là NSDictionary s. Ví dụ:

NSString *departmentName = [self valueForKeyPath:@"[person.department.name"]; 

Mặc dù đây chỉ là một ví dụ đáng tiếc.

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