zoukankan      html  css  js  c++  java
  • ios开发 Reflection(三) 利用反射自动绑值

    反射的具体应用,自动绑值

    获取属性列表

     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
  • 相关阅读:
    java位运算
    java笔试题(面试题)系列之一
    Java数据类型转换总结
    ++a和a++
    Java IO
    Java 并发
    Java位运算及补码存储
    Redis 5.0.0安装部署(伪集群版)
    Redis 安装(单机版)
    Dubbo源码分析系列之【服务暴露】
  • 原文地址:https://www.cnblogs.com/guchengfengyun/p/4065555.html
Copyright © 2011-2022 走看看