經(jīng)常遇到這樣情況,當(dāng)你從后臺拿到數(shù)據(jù),字典類型,里面有很多字段,多的時(shí)候,可能會幾十個(gè),這個(gè)時(shí)候,字段轉(zhuǎn)換到模型,模型類的幾十個(gè)字段,你要一個(gè)一個(gè)為其塞值么?我們就是這樣干的。但是,總感覺代碼很傻。
好了,現(xiàn)在可以這樣:動態(tài)獲取模型類的所有屬性,然后用字典里面的值為其塞值。
這里用到了運(yùn)行時(shí),運(yùn)行時(shí),直到運(yùn)行時(shí)才編譯。
一、擴(kuò)展NSArray分類
NSArray+Extension.h:
#import <Foundation/Foundation.h>
@interface NSArray (Extension)
+ (instancetype)getProperties:(Class)cls;
@end
NSArray+Extension.m:
#import "NSArray+Extension.h"
#import <objc/runtime.h>// 導(dǎo)入運(yùn)行時(shí)文件
@implementation NSArray (Extension)
//返回當(dāng)前類的所有屬性
+ (instancetype)getProperties:(Class)cls{
// 獲取當(dāng)前類的所有屬性
unsigned int count;// 記錄屬性個(gè)數(shù)
objc_property_t *properties = class_copyPropertyList(cls, &count);
// 遍歷
NSMutableArray *mArray = [NSMutableArray array];
for (int i = 0; i < count; i++) {
// An opaque type that represents an Objective-C declared property.
// objc_property_t 屬性類型
objc_property_t property = properties[i];
// 獲取屬性的名稱 C語言字符串
const char *cName = property_getName(property);
// 轉(zhuǎn)換為Objective C 字符串
NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
[mArray addObject:name];
}
return mArray.copy;
}
@end
二、定義模型類
假設(shè)模型類為 CZLoopImage,則
CZLoopImage.h
#import <Foundation/Foundation.h>
@interface CZLoopImage : NSObject
// 定義了下面兩個(gè)屬性,示例用,實(shí)際開發(fā)中有可能會幾十個(gè)屬性
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *imgsrc;
+ (instancetype)loopImage:(NSDictionary *)dic;
CZLoopImage.m
#import "CZLoopImage.h"
#import "NSArray+Extension.h"
@implementation CZLoopImage
+ (instancetype)loopImage:(NSDictionary *)dic{
id loopImage = [self new];
//獲取所有屬性 ,遍歷 給屬性賦值
NSArray *names = [NSArray getProperties:[self class]];// #import "NSArray+Extension.h" 使用分類
for (NSString *name in names) {
//如果字典中的值為空,賦值可能會出問題
if (dic[name]) {
[loopImage setValue:dic[name] forKey:name];
}
}
return loopImage;
}
NSArray+Extension可以多處重用,這樣,從后臺拿到數(shù)據(jù),字典轉(zhuǎn)模型,代碼寫得就優(yōu)雅多了。
參考: