“collection element of type BOOL”不是Objective-C对象。

12

有人知道我为什么会收到这个吗?

-(void)postPrimaryEMWithEM:(EM *)em
              exclusive:(BOOL) isExclusive
                 success:(void (^)())onSuccess
                 failure:(void (^)())onFailure {


if(self.accessToken) {


    GenericObject *genObject = [[GenericObject alloc] init];

    [[RKObjectManager sharedManager] postObject:genObject
                                          path:@"users/update.json"
                                    parameters:@{
                                                  ...
                                                 @"em_id"  : ObjectOrNull(em.emID),
                                                 @"exclusive": isExclusive  <-- error message

这段程序相关的内容翻译成中文如下:这个代码会起作用吗?(void)postPrimaryEMWithEM:(EM *)em exclusive:(BOOL)isExclusive success:(void (^)())onSuccess failure:(void (^)())onFailure - logixologist
不,它不行。我先试过了。 - jdog
isExclusive 应该是 BOOL * 而不仅仅是 BOOL 吗?实际上你可能有两个问题。如果参数的目的是将值返回给调用者,则使用 BOOL * 是可以的。 - rmaddy
BOOL* 是指向 BOOL 的指针。有合法的使用场景,但这不是其中之一。跳过 *。 (并尝试学习更多关于“东西”和“指向东西的指针”之间的区别 - 这对于在 Objective-C 中编程至关重要。) - Hot Licks
@jgervin,你已经修复了postPrimaryEMWithEM方法的参数,但是你仍然需要在RKObjectManager方法中使用@(isExclusive)语法(或者[NSNumber numberWithBool:isExclusive])。如果你这样做,它将正确地将布尔值表示为JSON中的truefalse - Rob
2个回答

15

你不能把一个基本数据类型放在字典中,必须使用对象。但是你可以使用[NSNumber numberWithBool:isExclusive]或者使用@(isExclusive)语法:

[[RKObjectManager sharedManager] postObject:genObject
                                       path:@"users/update.json"
                                 parameters:@{
                                              ...
                                             @"em_id"  : ObjectOrNull(em.emID),
                                             @"exclusive": @(isExclusive), ...

我也不认为你打算将 BOOL * 作为参数使用。你可能本意是:

- (void)postPrimaryEMWithEM:(EM *)em
                  exclusive:(BOOL) isExclusive
                    success:(void (^)())onSuccess
                    failure:(void (^)())onFailure {
    ...
}

再次强调,BOOL 不是一个对象,因此 * 语法很可能不是有意为之。


2
请注意,isExclusive 是一个 BOOL * - rmaddy
1
同时从你的类声明中删除指针类型:postPrimaryEMWithEM:exclusive:(BOOL)isExclusive。 - Greg
@rmaddy,是的,当你和Greg发表评论时,我正在扩展我的回答。完全正确。 - Rob
@Rob,感谢您指出这一点。但实际请求是否代表整数值的真或假呢? - Chris
1
@Chris 不,JSON 应该是 {"exclusive":true, ...}。或者你是想要数字格式? - Rob
显示剩余4条评论

8

从您的BOOL中删除指针(' *'):

exclusive:(BOOL*) isExclusive

并更改为:

@"exclusive": isExclusive

to:

@"exclusive": [NSNumber numberWithBool:isExclusive]

或者:

// Literal version of above NSNumber
@"exclusive": @(isExclusive)

需要注意的是,NSDictionary无法存储基本类型,包括布尔值。因此,您必须将该值封装在对象中,例如NSNumber。


3
为什么要发布重复的答案? - rmaddy
为什么你和别人同时回答了同一个问题?我在回答时没有看到之前的答案。因为我没有看到类似的答案,所以我应该删除我的回答吗? - Chris
@rmaddy 你是认真的吗?我可以读时间。你在这里做出了一个很大的假设。 - Chris
我很认真。我是在评论另一个答案时看到你的回答大约15分钟后出现的。没有假设,只有现实。 - rmaddy
你仍然假设我是有意发布重复答案,因为你说“为什么要发布重复答案?” - Chris
显示剩余2条评论

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