iOS开发-Model利用runtime快速初始化

1. 实体类中属性太多,如何进行快速初始化?

现有如下类:

  • TestModel.h
#import 

NS_ASSUME_NONNULL_BEGIN

@interface TestModel : NSObject

@property (nonatomic, copy) NSString *property1;

@property (nonatomic, copy) NSString *property2;

@property (nonatomic, copy) NSString *property3;

@property (nonatomic, copy) NSString *property4;

@property (nonatomic, copy) NSString *property5;

@property (nonatomic, copy) NSString *property6;

@end

NS_ASSUME_NONNULL_END
  • TestModel.m中逐个初始化属性
#import "TestModel.h"

@implementation TestModel

- (instancetype)init{
    self = [super init];
    if (self) {
        self.property1 = @"";
        self.property2 = @"";
        self.property3 = @"";
        self.property4 = @"";
        self.property5 = @"";
        self.property6 = @"";
    }
    return self;
}

@end

2. 实现快速初始化的方法

使用runtime初始化实体类,这样就不需要对每个属性进行初始化啦!

  1. NSObject分类中导入runtime头文件#import
  2. 在分类中添加如下方法
- (void)makePropetiesValueEmptyString {
    unsigned int methodCount = 0;
    Ivar * ivars = class_copyIvarList([self class], &methodCount);
    for (unsigned int i = 0; i < methodCount; i ++) {
        Ivar ivar = ivars[i];
        // 获取属性名称
        NSString *propertyName = [NSString stringWithUTF8String:ivar_getName(ivar)];
        // 获取属性类型
        NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
        if ([propertyType containsString:@"String"]) {
            // 初始化类型为NSString的属性
            [self setValue:@"" forKey:propertyName];
        }
    }
    free(ivars);
}
  1. TestModel.m中导入NSObject分类的头文件,并在init初始化方法中调用makePropetiesValueEmptyString方法即可。
#import "TestModel.h"
#import "NSObject+Assistant.h"

@implementation TestModel

- (instancetype)init{
    self = [super init];
    if (self) {
        [self makePropetiesValueEmptyString];
    }
    return self;
}

@end

  1. 这样实现之后,[TestModel new]或者[[TestModel alloc] init]的时候就会初始化全部NSString类型的属性了。

你可能感兴趣的:(iOS开发-Model利用runtime快速初始化)