NSMutableArray 中的 BOOL 给出了错误的答案
BOOL inside of NSMutableArray gives wrong answer
我有一个包含 BOOL 的 NSMutableArray。通过以下方式添加元素:
addObject:@[@YES, sectionInfo.header, myFeedSource.header
然后我按如下方式遍历数组:
for (int i=0; i<revealController.headersSelected.count; i++) {
isActive = [revealController.headersSelected[i][0] boolValue];
MLog(@"Active %@",revealController.headersSelected[i][0]);
MLog(@"class %@",[revealController.headersSelected[i][0] class]);
MLog(@"converted %d",[revealController.headersSelected[i][0] boolValue]);
if (isActive) {
MLog(@"Yes");
}else {
MLog(@"No");
}
if (revealController.headersSelected[i][0]) {
MLog(@"Yes");
}else {
MLog(@"No");
}
if (revealController.headersSelected[i][0]>0) {
MLog(@"Yes");
}else {
MLog(@"No");
}
输出为:
Active 0
class __NSCFBoolean
converted 0
No
Yes
Yes
我可以让它看到子元素的正确值的唯一方法是将其转换为 var:
isActive = [revealController.headersSelected[i][0] boolValue];
此 BOOL 的值通过 replaceObjectAtIndex:
在 For..Next 循环内设置
我在这里错过了什么?为什么它看不到 BOOL 的正确值?
前后打印了整个数组,值从1变成0。
对您的输出的评论:
Active 0 This is truth
class __NSCFBoolean This is truth
converted 0 This is truth
No This is truth
Yes This is a lie, because you're testing for pointer existence
Yes This is a lie, because you're testing the pointer isn't a zero
所以,我猜你正在编辑的东西有时是一个副本,而不是将其更新回你的数据结构,和/或你需要小心解包 NSNumber
实例。
您只能将对象存储在 NSArray
中,不能像 BOOL 这样的内部类型。 @YES
是 shorthand 的表达方式 [NSNumber numberWithBool:YES]
- 即您正在创建一个具有所需布尔值的 NSNumber 对象。
NSNumber 是一个 class 集群,因此它会选择合适的子class 来存储您的值。在本例中,它是一个 NSCFBoolean
。为了访问布尔值,您需要使用所示的 boolValue
方法。
我有一个包含 BOOL 的 NSMutableArray。通过以下方式添加元素:
addObject:@[@YES, sectionInfo.header, myFeedSource.header
然后我按如下方式遍历数组:
for (int i=0; i<revealController.headersSelected.count; i++) {
isActive = [revealController.headersSelected[i][0] boolValue];
MLog(@"Active %@",revealController.headersSelected[i][0]);
MLog(@"class %@",[revealController.headersSelected[i][0] class]);
MLog(@"converted %d",[revealController.headersSelected[i][0] boolValue]);
if (isActive) {
MLog(@"Yes");
}else {
MLog(@"No");
}
if (revealController.headersSelected[i][0]) {
MLog(@"Yes");
}else {
MLog(@"No");
}
if (revealController.headersSelected[i][0]>0) {
MLog(@"Yes");
}else {
MLog(@"No");
}
输出为:
Active 0
class __NSCFBoolean
converted 0
No
Yes
Yes
我可以让它看到子元素的正确值的唯一方法是将其转换为 var:
isActive = [revealController.headersSelected[i][0] boolValue];
此 BOOL 的值通过 replaceObjectAtIndex:
在 For..Next 循环内设置我在这里错过了什么?为什么它看不到 BOOL 的正确值?
前后打印了整个数组,值从1变成0。
对您的输出的评论:
Active 0 This is truth
class __NSCFBoolean This is truth
converted 0 This is truth
No This is truth
Yes This is a lie, because you're testing for pointer existence
Yes This is a lie, because you're testing the pointer isn't a zero
所以,我猜你正在编辑的东西有时是一个副本,而不是将其更新回你的数据结构,和/或你需要小心解包 NSNumber
实例。
您只能将对象存储在 NSArray
中,不能像 BOOL 这样的内部类型。 @YES
是 shorthand 的表达方式 [NSNumber numberWithBool:YES]
- 即您正在创建一个具有所需布尔值的 NSNumber 对象。
NSNumber 是一个 class 集群,因此它会选择合适的子class 来存储您的值。在本例中,它是一个 NSCFBoolean
。为了访问布尔值,您需要使用所示的 boolValue
方法。