iOS 運(yùn)行時(shí)獲取類的所有屬性

經(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)雅多了。

參考:

  1. Objective-C Runtime 運(yùn)行時(shí)之一:類與對象

  2. Objective-C Runtime

  3. Objective-C的動態(tài)特性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容