我有一个字典,其中包含来自REST端点的用户数据。这是我的用户类别
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (strong, nonatomic) NSString *uid;
@property (strong, nonatomic) NSString *email;
@property (strong, nonatomic) NSString *firstName;
@property (strong, nonatomic) NSString *lastName;
@property (assign, nonatomic) int status;
@end
我有一种设置所有属性的方法
/*
* set properties
*/
- (void)setPropertiesWithDictionary:(NSDictionary *)dictionary{
for(NSString *key in dictionary){
object_setIvar(self,
class_getInstanceVariable([self class], [[@"_" stringByAppendingString:key] UTF8String]),
dictionary[key]);
}
}
而不是像[user setUid:@dictionary[@"uid"]];
我想这样调用我的方法[user setPropertiesWithDictionary: dictionary];
只是想知道以这种方式实现object_setIvar
是否很好。如果不是-如果您能解释原因,那将非常棒。提前致谢。
您喜欢做什么,但是为什么在已经存在键值编码(KVC)的情况下重新发明轮子呢?只需调用此方法:
KVC完成了您想做的事情,但是它做得比您可能做的要好得多。
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/index.html
我认为您的问题可能与“ int status”有关,因为字典[@“ status”]的类型不是int。
在您的代码实现中,user.status = dictionary [@“ status”],此结果不可预测。
除非您做出类型判断,否则user.status = [dictionary [@“ status”] intValue];
我在github上推荐了一个名为MJExtension的第三方框架,它可以满足您的需求。您可以查看源代码。