-1

我遇到了一个关于JSONModel和将字符串 T 转换为 a的有趣问题BOOl。我在 JSON 中传递了一个字符串值 T,需要将其转换为 BOOL。

使用 JSONModel,转换在 64 位设备上工作,正确地将 T 转换为 1(显然这里发生了一些魔术)。但是,在 32 位设备上,T 被错误地转换为 0。我无法弄清楚为什么会发生这种情况以及如何解决它。

我知道JSONValueTransformer BOOLFromNSString32 位设备调用它,并返回 NO,但 64 位设备不调用它。

有谁更了解 32 位/64 位架构以及为什么会发生这种情况?如何解决此问题,以便在 32 位和 64 位设备上返回正确的 BOOL 值?

4

1 回答 1

1

在你链接的项目中,BOOLFromNSString方法如下:

-(NSNumber*)BOOLFromNSString:(NSString*)string
{
  if (string != nil && 
    ([string caseInsensitiveCompare:@"true"] == NSOrderedSame ||
    [string caseInsensitiveCompare:@"yes"] == NSOrderedSame)) {
    return [NSNumber numberWithBool:YES];
  }
  return [NSNumber numberWithBool: ([string intValue]==0)?NO:YES];
}

这意味着它将返回YES以下不区分大小写的值:true, yes, [any number that isn't 0]

YES它在任何平台上返回的事实T是神奇的,而不是“正确的”。您应该使用预期值之一。


编辑:您的子类:

#import "JSONModelTransformations/JSONValueTransformer.h"

@interface MyParser : JSONValueTransformer
@end

@implementation MyParser
- (NSNumber *)BOOLFromNSString:(NSString *)string {
  if (string != nil && [string caseInsensitiveCompare:@"t"] == NSOrderedSame) {
    return [NSNumber numberWithBool:YES];
  }
  return [super BOOLFromNSString:string];
}
@end
于 2014-11-04T18:57:15.113 回答