iOS 執行時獲取類的所有屬性
經常遇到這樣情況,當你從後臺拿到資料,字典型別,裡面有很多欄位,多的時候,可能會幾十個,這個時候,欄位轉換到模型,模型類的幾十個欄位,你要一個一個為其塞值麼?我們就是這樣乾的。但是,總感覺程式碼很傻。
好了,現在可以這樣:動態獲取模型類的所有屬性,然後用字典裡面的值為其塞值。
這裡用到了執行時,執行時,直到執行時才編譯。
一、擴充套件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可以多處重用,這樣,從後臺拿到資料,字典轉模型,程式碼寫得就優雅多了。
參考:
相關文章
- python 獲取類的屬性Python
- 獲取類屬性值,當前類,父類
- 揭秘Java反射:如何輕鬆獲取類的屬性及父類屬性Java反射
- C#通過反射獲取物件屬性,列印所有欄位屬性的值C#反射物件
- 獲得類的屬性
- 獲取影像的屬性
- iOS 開發:『Runtime』詳解(四)獲取類詳細屬性、方法iOS
- opencv 獲取影像的屬性OpenCV
- Java 執行緒池獲取池中所有執行緒列表的方法Java執行緒
- js如何獲取給定屬性的屬性值JS
- 獲取gridview所有行的idView
- C# 隨機給一個全部資訊都未知的類型別,如何獲取該類的類名、屬性個數、屬性名、屬性的資料型別、屬性值?C#隨機資料型別
- JavaScript 獲取 checked 屬性值JavaScript
- javascript如何獲取屬性值JavaScript
- javascript獲取物件直接量中的屬性和屬性值JavaScript物件
- js獲取元素的方法與屬性JS
- 視窗屬性的獲取函式函式
- 將不確定變為確定~類中的屬性何時被執行
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- js如何獲取某一類type屬性值表單元素JS
- 在url中通過屬性名獲取屬性值
- 如何獲取 C# 類中發生資料變化的屬性資訊C#
- 怎樣在程式中獲取所有執行緒的堆疊資訊?執行緒
- jQuery - 獲取內容和屬性jQuery
- PHP獲取檔案基本屬性的方法PHP
- jquery設定和獲取元素的屬性jQuery
- ms sql 獲取表欄位的屬性SQL
- C#反射設定屬性值和獲取屬性值C#反射
- 獲取dom的最終的css屬性值CSS
- 獲取物件屬性型別、屬性名稱、屬性值的研究:反射和JEXL解析引擎物件型別反射
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- lambda方法引用獲取欄位屬性
- 在Progress中獲取檔案屬性
- C# 獲取修改了哪些屬性C#
- iOS 通過runtime獲取某個類中所有的變數和方法iOS變數
- C#獲取某個物件的屬性值C#物件
- js通過元素的class屬性獲取元素JS
- jQuery獲取id屬性值具有點的元素jQuery