1. 实体类中属性太多,如何进行快速初始化?
现有如下类:
TestModel.h
#import <Foundation/Foundation.h>
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
初始化实体类,这样就不需要对每个属性进行初始化啦!
- 在
NSObject
分类中导入runtime头文件#import <objc/runtime.h>
- 在分类中添加如下方法
- (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);
}
- 在
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
- 这样实现之后,
[TestModel new]
或者[[TestModel alloc] init]
的时候就会初始化全部NSString类型的属性了。
网友评论