iOS 執行時獲取類的所有屬性

躍然發表於2015-11-10

經常遇到這樣情況,當你從後臺拿到資料,字典型別,裡面有很多欄位,多的時候,可能會幾十個,這個時候,欄位轉換到模型,模型類的幾十個欄位,你要一個一個為其塞值麼?我們就是這樣乾的。但是,總感覺程式碼很傻。
好了,現在可以這樣:動態獲取模型類的所有屬性,然後用字典裡面的值為其塞值。
這裡用到了執行時,執行時,直到執行時才編譯。

一、擴充套件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>// 匯入執行時檔案
@implementation NSArray (Extension)

//返回當前類的所有屬性
+ (instancetype)getProperties:(Class)cls{

    // 獲取當前類的所有屬性
    unsigned int count;// 記錄屬性個數
    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);
        // 轉換為Objective C 字串
        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
        [mArray addObject:name];
    }

    return mArray.copy;
}


@end

二、定義模型類

假設模型類為 CZLoopImage,則

CZLoopImage.h

#import <Foundation/Foundation.h>

@interface CZLoopImage : NSObject

// 定義了下面兩個屬性,示例用,實際開發中有可能會幾十個屬性
@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可以多處重用,這樣,從後臺拿到資料,字典轉模型,程式碼寫得就優雅多了。

參考:

  1. Objective-C Runtime 執行時之一:類與物件

  2. Objective-C Runtime

  3. Objective-C的動態特性

相關文章