iOS转换为BOOL

时间:2015-01-23 15:07:45

标签: ios objective-c casting

这两行代码是不同还是相同(编辑:他们做同样的事情,强制转换为布尔值吗?):

BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];

BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Is Registered"] boolValue];

在iOS8.1中,第一个肯定是失败的。对bool的强制转换不起作用,强制转换总是返回错误状态。正在存储该值(对于第二个示例),如下所示:

[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%i", registerSuccess] 
                                          forKey:@"Is Registered"];

registerSuccess是从Web服务(JSON)返回的值。

4 个答案:

答案 0 :(得分:5)

你将一个NSString对象转换为bool,它永远不会做任何有用的事情。演员表不会改变或转换某些内容,它只会使编译器静音。

假设isRegistered是一个NSNumber对象,因为它将从JSON响应中反序列化: 使用NSNumber

[[NSUserDefaults standardUserDefaults] setObject:registerSuccess forKey:@"isRegistered"];

BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];

或Bool直接

[[NSUserDefaults standardUserDefaults] setBool:[registerSuccess boolValue]forKey:@"isRegistered"];

BOOL isRegistered = [[NSUserDefaults standardUserDefaults] boolForKey:@"isRegistered];

答案 1 :(得分:2)

首先,请考虑使用NSUserDefaults boolForKey:

回答你的问题:

BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];

这里NSUserDefaults返回NSNumber,并且您正在尝试将指向NSNumber的指针转换为BOOL。如果您的设置完全没有定义,valueForKey将返回nil,则会被视为false。如果为此设置设置了任何值,valueForKey将返回指向NSNumber的指针,当您尝试将其转换为BOOL时,您将始终为True。

BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];

此处,NSUserDefaults会向您返回NSNumber,并在其上调用boolValue,并且它正如您所期望的那样工作。如果根本没有定义设置,valueForKey将返回nil,在nil上调用boolValue将返回另一个nil,这将被转换为false;

答案 2 :(得分:1)

我建议保存值如下:

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:registerSuccess] forKey:@"DEVICE_REGISTERED"];

然后在您显示的代码的第二行中读取值,但使用密钥@“DEVICE_REGISTERED”。

答案 3 :(得分:1)

我使用下面的代码来编写和读取布尔值


// assume that "isDeviceRegisterred" is a boolean data type parameter that comes from the web service
[[NSUserDefaults standardUserDefaults] setBool:isDeviceRegisterred  forKey:@"DEVICE_REGISTERED"];

BOOL isRegistered = [[NSUserDefaults standardUserDefaults] boolForKey:@"DEVICE_REGISTERED"];