Objective-C. NSString被更改为NSCFNumber

3

我有一些Objective-C的代码。我认为我收到了NSString类型,但是当我尝试将它保存在Core Data中时,我会得到一个user.clientID = clientID;错误,如下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "clientID"; desired type = NSString; given type = __NSCFNumber; value = 29.'

所以,这是我的代码:

我的数据管理单例PKDataManager.h

+(PKDataManager*) sharedManager;

- (void)updateCoreDataUserWithID:(NSString*) userID
                 andClientID:(NSString*) clientID;

PKDataManager.m

- (void)updateCoreDataUserWithID:(NSString*) userID
                 andClientID:(NSString*) clientID{

       PKUser*user = [NSEntityDescription 
       insertNewObjectForEntityForName:@"PKUser" 
       inManagedObjectContext:self.managedObjectContext];
       user.userID = userID;
       user.clientID = clientID; ///// error showing here
       [self.managedObjectContext insertObject:user];
       [self.managedObjectContext save:nil];
}

我的API单例PKServerManager.h

+ (PKServerManager*) sharedManager;

- (void) sendUserID:(NSString*) userID
              onSuccess:(void(^)(NSString* clientID)) success
              onFailure:(void(^)(NSError* error, NSInteger statusCode)) failure;

PKServerManager.m

- (void) sendUserID:(NSString*) userID
                  onSuccess:(void(^)(NSString* clientID)) success
                  onFailure:(void(^)(NSError* error, NSInteger statusCode)) failure{
        NSDictionary* params =
        [NSDictionary dictionaryWithObjectsAndKeys:
         userID, @"userID", nil];
        [self.requestOperationManager
         POST:@"app/registration"
         parameters:params
         progress:nil
         success:^(NSURLSessionTask *task, NSDictionary* responseObject) {
            NSLog(@"JSON: %@", responseObject);
            NSString* clientID = (NSString*)[responseObject objectForKey:@"clientId"];
            if (success) {
                success(clientID);
            }
         } failure:^(NSURLSessionTask *operation, NSError *error) {
         }];
}

我的代码: PKProfile.m

[[PKServerManager sharedManager]
     sendUserID:profile.userID
     onSuccess:^(NSString* clientID) {
         NSLog(@"clientID %@", clientID);
         [[PKDataManager sharedManager] updateCoreDataUserWithID: profile.userID
                                                     andClientID: clientID];
     }
     onFailure:^(NSError *error, NSInteger statusCode) {
     }];

profile.userID 是在哪里设置的? - Nathan Hillyer
NSString* clientID = (NSString*)[responseObject objectForKey:@"clientId"];之后设置一个断点,在调试器中检查clientID是否实际上是NSString,或者你只是强制将其转换为NSNumber。 - Leonardo
2个回答

3
在您的 PKServerManager.m 文件中,替换以下代码行:
NSString* clientID = (NSString*)[responseObject objectForKey:@"clientId"];

使用

NSString* clientID = [NSString stringWithFormat:@"%@",[responseObject objectForKey:@"clientId"]];

3
这段代码为什么假定clientId是字符串,而服务器却将其作为数字发送给客户端,这让人不禁想要问一下为什么。 - rmaddy

3

您的错误提示是告诉您该响应中包含了一个客户端ID的数字值(在responseObject中表示为NSNumberNSCFNumber是更广泛的NSNumber类簇的一部分)。看起来您的JSON响应中包含了如下内容:

{
    ...,
    "clientId": 42
}

相较于
{
    ...,
    "clientId": "42"
}

与其专注于如何将这个NSNumber转换为NSString,我更倾向于考虑在整个应用程序中更改客户端ID为NSInteger(或NSNumber)。如果这些ID确实是数字值,则最好有一个反映该值类型的类型。

1
你是绝对正确的!如果clientId是数字(整数)值,则应使用NSInteger进行处理。 - Krunal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接