-1

JSONModelと文字列 T から への変換に関する興味深い問題が発生していBOOlます。JSON で文字列値 T が渡され、BOOL に変換する必要があります。

JSONModel を使用すると、変換は 64 ビット デバイスで機能し、T を 1 に正しく変換します (明らかに、いくつかの魔法がここで行われています)。ただし、32 ビット デバイスでは、T が誤って 0 に変換されます。なぜこれが起こっているのか、どうすれば修正できるのかがわかりません。

が 32 ビット デバイスに対して呼び出され、NO を返すことはわかっていJSONValueTransformer BOOLFromNSStringますが、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 に答える