无法将 NSDictionary 参数写入自定义对象

Posted

技术标签:

【中文标题】无法将 NSDictionary 参数写入自定义对象【英文标题】:Can't write NSDictionary parameters into custom Object 【发布时间】:2016-03-09 11:35:39 【问题描述】:

我一直坚持将 NSDictionary 写入 Object 进程,我相信这个问题很简单,但如果能得到帮助会很棒。这是我的代码:

我的自定义对象:

@interface User : NSObject

@property (nonatomic, retain) NSString *cId;
@property (nonatomic, retain) NSString *firstName;
@property (nonatomic, retain) NSString *lastName;
....

-(instancetype) initWithParameters:(NSDictionary*) parameters;

@end


#import "User.h"

@implementation User

-(instancetype) initWithParameters:(NSDictionary*) parameters

    self = [super init];
    if (self) 
        [self setParameters:parameters];
    
    return self;


- (void) setParameters:(NSDictionary*) parameters
    _cId = parameters[@"cId"];
    _firstName = parameters[@"first_name"];
    _lastName = parameters[@"last_name"];
    ....
 

及写作过程:

id userObjects = [resultData objectForKey:@"data"];
NSMutableArray* mUsers = [[NSMutableArray alloc] init];
for (NSDictionary* userParameters in userObjects) 
    User *user = [[User alloc] initWithParameters:userParameters];
    [mUsers addObject:user];

userObjects - NSArray 从服务器数据的 JSON 对象中获取。

问题是:初始化后什么都没有发生,用户对象仍然为空,然后我尝试了 - setValuesForKeysWithDictionary 在我调用与字典中的键相同的变量并且没有任何改变之后。

添加 mUsers 后:

谁能告诉我我做错了什么?谢谢!

【问题讨论】:

你调试过initWithParameters吗?是否在这种情况下 if (self) user 只是一个局部变量,mUsers 是什么?我会避免声明以set 开头的方法,因为它可以被视为属性设置器。 @Kiran 是的,调试器只是一步一步地移动,没有警告或日志,一切顺利,但变量仍然为空。 正如 vadian 所说.. 用户是局部变量。您尝试记录 mUsers。 @vadian 函数名在这种情况下并不重要,因为我已经尝试在 init 函数中正确地完成这项工作。 mUsers 就是你可以在上面看到的 NSMutableArray 【参考方案1】:

我相信您认为这些对象未初始化,因为您在每个 User 对象旁边看到了 0 key/value pairs

您的代码看起来不错,我认为一旦您像这样实现[NSObject description](或[NSObject debugDescription]),情况就会发生变化:

- (NSString *)description

    return [NSString stringWithFormat:@"cId=%@, firstName=%@, lastName=%@",
        _cId, _firstName, _lastName];

【讨论】:

你是对的,我使用了日志并且有所有需要的信息,奇怪的是我依赖调试器,我的错 :) 谢谢!

以上是关于无法将 NSDictionary 参数写入自定义对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RKMappingOperation 将本地 NSDictionary 映射到自定义对象?

从 NSDictionary 实例化自定义类

NSDictionary 与自定义对象

将 NSDictionary 解析为带有自定义分隔符的字符串

AWS 事件总线无法将日志写入来自 AWS Lambda 的自定义日志组上的 CloudWatch

无法将“Promise<[NSDictionary]>”类型的值转换为预期的参数类型“Guarantee<Void>”