反射的具体应用,自动绑值
获取属性列表
1 - (NSArray*)propertyKeys 2 { 3 unsigned int outCount, i; 4 objc_property_t *properties = class_copyPropertyList([self class], &outCount); 5 NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount]; 6 for (i = 0; i < outCount; i++) { 7 objc_property_t property = properties[i]; 8 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 9 [keys addObject:propertyName]; 10 } 11 free(properties); 12 return keys; 13 }
字典与属性列表形成映射
1 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource 2 { 3 BOOL ret = NO; 4 for (NSString *key in [self propertyKeys]) { 5 if ([dataSource isKindOfClass:[NSDictionary class]]) { 6 ret = ([dataSource valueForKey:key]==nil)?NO:YES; 7 } 8 else 9 { 10 ret = [dataSource respondsToSelector:NSSelectorFromString(key)]; 11 } 12 if (ret) { 13 id propertyValue = [dataSource valueForKey:key]; 14 //该值不为NSNULL,并且也不为nil 15 if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) { 16 [self setValue:propertyValue forKey:key]; 17 } 18 } 19 } 20 return ret; 21 }
下面是BookModel类的自动绑值的实现
1 #import <Foundation/Foundation.h> 2 @interface BookModel : NSObject 3 { 4 NSString* _iconUrl; 5 NSString* _bookName; 6 NSString* _publisher; 7 NSString* _price; 8 NSString* _autherName; 9 NSString* _pubdate; 10 NSString* _translator; 11 NSString* _introUrl; 12 NSInteger _numRatings; 13 CGFloat _rating; 14 } 15 @property(retain, nonatomic)NSString* iconUrl; 16 @property(retain, nonatomic)NSString* pubdate; 17 @property(retain, nonatomic)NSString* introUrl; 18 @property(retain, nonatomic)NSString* autherName; 19 @property(retain, nonatomic)NSString* translator;; 20 @property(retain, nonatomic)NSString* bookName; 21 @property(retain, nonatomic)NSString* publisher; 22 @property(retain, nonatomic)NSString* price; 23 @property(assign, nonatomic)NSInteger numRatings; 24 @property(assign, nonatomic)CGFloat rating; 25 26 - (NSArray*)propertyKeys; 27 28 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource; 29 30 @end
1 #import "BookModel.h" 2 #import <objc/runtime.h> 3 4 @implementation BookModel 5 @synthesize bookName = _bookName; 6 @synthesize iconUrl = _iconUrl; 7 @synthesize publisher = _publisher; 8 @synthesize price = _price; 9 @synthesize numRatings = _numRatings; 10 @synthesize rating = _rating; 11 @synthesize autherName = _autherName; 12 @synthesize pubdate = _pubdate; 13 @synthesize translator = _translator; 14 @synthesize introUrl = _introUrl; 15 16 - (id)init 17 { 18 self = [super init]; 19 if (self) { 20 // Initialization code here. 21 } 22 23 return self; 24 } 25 26 - (NSArray*)propertyKeys 27 { 28 unsigned int outCount, i; 29 objc_property_t *properties = class_copyPropertyList([self class], &outCount); 30 NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount]; 31 for (i = 0; i < outCount; i++) { 32 objc_property_t property = properties[i]; 33 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 34 [keys addObject:propertyName]; 35 } 36 free(properties); 37 return keys; 38 } 39 40 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource 41 { 42 BOOL ret = NO; 43 for (NSString *key in [self propertyKeys]) { 44 if ([dataSource isKindOfClass:[NSDictionary class]]) { 45 ret = ([dataSource valueForKey:key]==nil)?NO:YES; 46 } 47 else 48 { 49 ret = [dataSource respondsToSelector:NSSelectorFromString(key)]; 50 } 51 if (ret) { 52 id propertyValue = [dataSource valueForKey:key]; 53 //该值不为NSNULL,并且也不为nil 54 if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) { 55 [self setValue:propertyValue forKey:key]; 56 } 57 } 58 } 59 return ret; 60 } 61 62 63 @end
1 #import "ViewController.h" 2 #import "BookModel.h" 3 4 5 @interface ViewController () 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad 12 { 13 [super viewDidLoad]; 14 // Do any additional setup after loading the view, typically from a nib. 15 NSMutableDictionary *curDic=[[NSMutableDictionary alloc]init]; 16 [curDic setValue:@"iconUrlffwf" forKey:@"iconUrl"]; 17 [curDic setValue:@"pubdatefewfewf" forKey:@"pubdate"]; 18 [curDic setValue:@"introUrlfefewf" forKey:@"introUrl"]; 19 [curDic setValue:@"autherName" forKey:@"autherNamefwfwfw"]; 20 [curDic setValue:@"translatorfwfewf" forKey:@"translator"]; 21 [curDic setValue:@"bookNamefvvvv" forKey:@"bookName"]; 22 [curDic setValue:@"publisherfwfewf" forKey:@"publisher"]; 23 [curDic setValue:@"pricefwfwf" forKey:@"price"]; 24 [curDic setValue:@"numRatingsssss" forKey:@"numRatings"]; 25 [curDic setValue:@"ratinggggggg" forKey:@"rating"]; 26 27 BookModel *bModel=[[BookModel alloc]init]; 28 [bModel reflectDataFromOtherObject:curDic]; 29 NSLog(@"bModel:%@",bModel.translator); 30 31 } 32 33 - (void)didReceiveMemoryWarning 34 { 35 [super didReceiveMemoryWarning]; 36 // Dispose of any resources that can be recreated. 37 } 38 39 @end
时间: 2024-10-01 13:46:10