强大的KVC
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Book.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Book *b = [[Book alloc] init];
b.bookName = @"iOS";
Student *s = [[Student alloc] init];
// 使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换
[s setValue:@"jack" forKeyPath:@"name"];
[s setValue:@50 forKeyPath:@"age"];
s.book = b;
Book *b1 = [[Book alloc] init];
b1.bookName = @"iPhone";
Student *s1 = [[Student alloc] init];
[s1 setValue:@"mick" forKeyPath:@"name"];
[s1 setValue:@5 forKeyPath:@"age"];
s1.book = b1;
NSDictionary *dict = [s1 dictionaryWithValuesForKeys:@[@"name", @"age"]];
NSLog(@"%@", dict);
NSArray *array = @[s, s1];
// KVC按照键值路径取值时,如果对象不包含指定的键值,会自动进入对象内部,查找对象属性
NSArray *a = [array valueForKeyPath:@"book.bookName"];
NSLog(@"%@", a);
}
return 0;
}
字典中显示汉字
#import <Foundation/Foundation.h>
@interface NSArray (Log)
@end
#import "NSArray+Log.h"
@implementation NSArray (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
// 遍历数组中的所有内容,将内容拼接成一个新的字符串返回
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"(\n"];
// 遍历数组,self就是当前的数组
for (id obj in self) {
// 在拼接字符串时,会调用obj的description方法
[strM appendFormat:@"\t%@,\n", obj];
}
[strM appendString:@")"];
return strM;
}
@end
setValuesForKeysWithDictionary
// 使用setValuesForKeys要求类的属性必须在字典中存在,可以比字典中的键值多,但是不能少!
[self setValuesForKeysWithDictionary:dict];
使用setValuesForKeysWithDictionary会自动查找字典里面的key,与调用次方法的对象的成员变量相匹配!