为什么我不应该使用 object_setIvar 来设置属性
Why should I not use object_setIvar to set properties
我有一个字典,其中包含来自 REST 端点的用户数据。这是我的用户 class
#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,满足你的需求needs.You可以看看源码
我有一个字典,其中包含来自 REST 端点的用户数据。这是我的用户 class
#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,满足你的需求needs.You可以看看源码