Sự khác nhau giữa objectForKey
và valueForKey
là gì? Tôi nhìn cả hai trong tài liệu và họ dường như giống với tôi.Sự khác nhau giữa objectForKey và valueForKey?
Trả lời
objectForKey:
là phương thức NSDictionary
. An NSDictionary
là một lớp sưu tập tương tự như một NSArray
, ngoại trừ thay vì sử dụng các chỉ mục, nó sử dụng các phím để phân biệt giữa các mục. Khóa là một chuỗi tùy ý mà bạn cung cấp. Không có hai đối tượng có thể có cùng một khóa (giống như không có hai đối tượng trong một NSArray
có thể có cùng một chỉ mục).
valueForKey:
là phương pháp KVC. Nó hoạt động với bất kỳ lớp học nào. valueForKey:
cho phép bạn truy cập thuộc tính bằng cách sử dụng một chuỗi cho tên của nó. Vì vậy, ví dụ, nếu tôi có một lớp Account
với một tài sản accountNumber
, tôi có thể làm như sau:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Sử dụng KVC, tôi có thể truy cập vào các tài sản tự động:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Đó là những bộ tương đương với các câu lệnh.
Tôi biết bạn đang suy nghĩ: wow, nhưng mỉa mai. KVC trông không hữu ích lắm. Trong thực tế, nó trông "dài dòng". Nhưng khi bạn muốn thay đổi mọi thứ trong thời gian chạy, bạn có thể thực hiện rất nhiều điều thú vị khó hơn nhiều trong các ngôn ngữ khác (nhưng điều này nằm ngoài phạm vi câu hỏi của bạn).
Nếu bạn muốn tìm hiểu thêm về KVC, có nhiều hướng dẫn nếu bạn đặc biệt là Google tại Scott Stevenson's blog. Bạn cũng có thể xem số NSKeyValueCoding Protocol Reference.
Hy vọng điều đó sẽ hữu ích.
Khi bạn làm valueForKey:
, bạn cần cung cấp cho nó NSString, trong khi objectForKey:
có thể lấy bất kỳ lớp con NSObject nào làm khóa. Điều này là do Mã hóa khóa-giá trị, các khóa luôn là chuỗi.
Trong thực tế, các tài liệu nói rằng ngay cả khi bạn cung cấp cho valueForKey:
một NSString, nó sẽ gọi objectForKey:
nào trừ khi chuỗi bắt đầu với một @
, trong trường hợp này nó gọi [super valueForKey:]
, có thể gọi valueForUndefinedKey:
có thể nâng cao một ngoại lệ.
bạn có thể vui lòng cho tôi liên kết của tài liệu bạn muốn nói không.cảm ơn bạn. –
@ عليامين: [It's right here] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/doc/uid/ 20000140-BBCIBCDJ) – dreamlax
Dưới đây là một lý do tuyệt vời để sử dụng objectForKey:
bất cứ nơi nào có thể thay vì valueForKey:
- valueForKey:
với một chìa khóa chưa biết sẽ ném NSUnknownKeyException
nói "lớp này không phải là giá trị quan trọng mã hóa tuân thủ cho phím".
tốt để biết rằng "valueForKey: với một khóa không xác định sẽ ném NSUnknownKeyException nói" lớp này không phải là giá trị khóa mã hóa tuân thủ cho khóa " – onmyway133
Như đã nói, kiểu dữ liệu objectForKey:
là :(id)aKey
trong khi kiểu dữ liệu valueForKey:
là :(NSString *)key
.
Ví dụ:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
Vì vậy, valueForKey:
sẽ chỉ mất một giá trị chuỗi và là một phương pháp KVC, trong khi objectForKey:
sẽ mất bất kỳ loại đối tượng.
Giá trị trong objectForKey
sẽ được truy cập bởi cùng một loại đối tượng.
- 1. Sự khác nhau giữa .Equals và ==
- 2. Sự khác nhau giữa% w và% W
- 3. Sự khác nhau giữa ParameterInfo.DefaultValue và ParameterInfo.RawDefaultValue
- 4. Sự khác nhau giữa MBean và MXBean
- 5. Sự khác nhau giữa ConfigurationManager và ConfigurationSettings
- 6. Sự khác nhau giữa Tkinter và Tkinter
- 7. Sự khác nhau giữa! = Và =! trong Java?
- 8. Sự khác nhau giữa 'SpecialFolder.LocalApplicationData' và 'SpecialFolder.ApplicationData'?
- 9. Sự khác nhau giữa String.getBytes() và IOUtils.toByteArray()?
- 10. Sự khác nhau giữa presentModalViewController và presentViewController?
- 11. Sự khác nhau giữa NSInvocationOperation và NSBlockOperation
- 12. Sự khác nhau giữa TVar và TMVar
- 13. Sự khác nhau giữa onClickListener và onItemClickListener
- 14. Sự khác nhau giữa `require` và` gem`
- 15. Sự khác nhau giữa HttpUtility.HtmlEncode và Server.HtmlEncode
- 16. Sự khác nhau giữa sqlplus và sqldeveloper?
- 17. Sự khác nhau giữa JPA và JPA2
- 18. Sự khác nhau giữa DECIMAL và NUMERIC
- 19. Sự khác nhau giữa "./somescript.sh" và ". ./somescript.sh"
- 20. Sự khác nhau giữa GIT và CVS
- 21. Sự khác nhau giữa System.Drawing.Point và System.Drawing.PointF
- 22. Sự khác nhau giữa REST và WebServices
- 23. Sự khác nhau giữa sys và os.sys
- 24. Sự khác nhau giữa select() và selectAll()
- 25. Sự khác nhau giữa restartLoader và onContentChanged
- 26. Sự khác nhau giữa dbcontext.Add và dbcontext.AddObject
- 27. Sự khác nhau giữa int32_t và int_fast32_t
- 28. Sự khác nhau giữa | và || trong MATLAB?
- 29. Có sự khác nhau giữa "và"
- 30. Sự khác nhau giữa `% trong%` và `== '
valueForKey hoạt động khác nhau đối với các đối tượng NSDictionary tùy thuộc vào việc khóa có bắt đầu bằng biểu tượng @ hay không. – dreamlax
objectForKey: chấp nhận bất kỳ đối tượng nào làm khóa, không chỉ là chuỗi. Yêu cầu duy nhất là khóa hỗ trợ giao thức NSCopying. –
Cả hai điểm này chắc chắn là đúng. NSDictionaries là một trường hợp đặc biệt và bạn không phải sử dụng chuỗi cho các khóa. Tôi đã không thực sự đi vào sự tinh tế của một trong hai vì có vẻ như người hỏi chỉ cần một so sánh đơn giản. –