我最近向苹果提交了一个关于此问题的错误报告,但我想问一下是否有什么明显的遗漏。在Objective-C中,在64位系统上,以下调用可以正常工作,但在32位系统上会抛出一个NSInvalidArgumentException异常:
[self setValue:@"true" forKey:@"flag"];
“flag”属性是一个BOOL类型的属性:
@property BOOL flag;
此外,在Swift/32位中,该属性为Bool时调用正常:
var flag: Bool = false
同样的代码在64位系统上可以正常运行,但在32位系统上会抛出NSInvalidArgumentException异常("index"是一个Int类型):
setValue("2", forKey: "index")
然而,在Objective-C/32位中,这个属性是一个NSInteger,在那里它可以正常工作。
我本来期望这些调用会正确地工作,无论是哪种语言或处理器架构。有没有人能解释一下为什么它们可能不起作用呢?
@"true"
的NSString
传递。那不是一个BOOL
。你不能将NSString
传递给BOOL
属性。这就是问题所在。 - rmaddyBOOL
值,而不是一个NSString
。但是你不能传递一个BOOL
,因为它不是一个对象类型。尝试传递等效的NSNumber
值来表示YES
,代码如下:[self setValue:@YES forKey:@"flag"];
。 - rmaddyBOOL
)如何使用NSNumber
进行处理。如果你希望你的代码正常运行,请将你的真/假字符串转换成正确的NSNumber
类型。 - rmaddy