iOS 转换为 BOOL
iOS Casting to a BOOL
这两行代码是不同的还是相同的(编辑:它们做同样的事情,类型转换为布尔值?):
BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Is Registered"] boolValue];
在iOS8.1中,第一个肯定是失败的。对 bool 的强制转换不起作用,强制转换总是返回 false。该值正在存储(对于第二个示例),如下所示:
[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%i", registerSuccess]
forKey:@"Is Registered"];
registerSuccess 是从网络服务 (JSON) 返回的值。
您将 NSString 对象转换为 bool,这将永远不会做任何有用的事情。强制转换不会更改或转换某些内容,它只会使编译器静音。
假设 isRegistered
是一个 NSNumber 对象,因为它会从 JSON 响应中反序列化:
使用 NSNumber
[[NSUserDefaults standardUserDefaults] setObject:registerSuccess forKey:@"isRegistered"];
和
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];
或者直接一个布尔值
[[NSUserDefaults standardUserDefaults] setBool:[registerSuccess boolValue]forKey:@"isRegistered"];
BOOL isRegistered = [[NSUserDefaults standardUserDefaults] boolForKey:@"isRegistered];
我建议按如下方式保存值:
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:registerSuccess] forKey:@"DEVICE_REGISTERED"];
然后像在您显示的代码的第二行中那样读回该值,但使用键 @"DEVICE_REGISTERED".
我使用下面的代码写入和读取布尔值
// 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"];
首先,考虑使用NSUserDefaults boolForKey:
。
回答您的问题:
BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];
此处 NSUserDefaults return NSNumber
,并且您正试图将指向 NSNumber 的指针转换为 BOOL。如果您的设置根本没有定义,valueForKey
将 return nil,这将被视为 false。如果为此设置设置了任何值,valueForKey
将 return 指向 NSNumber 的指针,当您尝试将其转换为 BOOL 时,您将始终为 True。
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];
这里 NSUserDefaults return NSNumber
给你,你在上面调用 boolValue
,它按你期望的那样工作。如果根本没有定义设置,valueForKey
将 return nil
,对 nil 调用 boolValue
将 return 另一个 nil,它被转换为 false;
这两行代码是不同的还是相同的(编辑:它们做同样的事情,类型转换为布尔值?):
BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Is Registered"] boolValue];
在iOS8.1中,第一个肯定是失败的。对 bool 的强制转换不起作用,强制转换总是返回 false。该值正在存储(对于第二个示例),如下所示:
[[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%i", registerSuccess]
forKey:@"Is Registered"];
registerSuccess 是从网络服务 (JSON) 返回的值。
您将 NSString 对象转换为 bool,这将永远不会做任何有用的事情。强制转换不会更改或转换某些内容,它只会使编译器静音。
假设 isRegistered
是一个 NSNumber 对象,因为它会从 JSON 响应中反序列化:
使用 NSNumber
[[NSUserDefaults standardUserDefaults] setObject:registerSuccess forKey:@"isRegistered"];
和
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];
或者直接一个布尔值
[[NSUserDefaults standardUserDefaults] setBool:[registerSuccess boolValue]forKey:@"isRegistered"];
BOOL isRegistered = [[NSUserDefaults standardUserDefaults] boolForKey:@"isRegistered];
我建议按如下方式保存值:
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:registerSuccess] forKey:@"DEVICE_REGISTERED"];
然后像在您显示的代码的第二行中那样读回该值,但使用键 @"DEVICE_REGISTERED".
我使用下面的代码写入和读取布尔值
// 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"];
首先,考虑使用NSUserDefaults boolForKey:
。
回答您的问题:
BOOL isRegistered = (BOOL)[[NSUserDefaults standardUserDefaults] valueForKey:@"DEVICE_REGISTERED"];
此处 NSUserDefaults return NSNumber
,并且您正试图将指向 NSNumber 的指针转换为 BOOL。如果您的设置根本没有定义,valueForKey
将 return nil,这将被视为 false。如果为此设置设置了任何值,valueForKey
将 return 指向 NSNumber 的指针,当您尝试将其转换为 BOOL 时,您将始终为 True。
BOOL isRegistered = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isRegistered"] boolValue];
这里 NSUserDefaults return NSNumber
给你,你在上面调用 boolValue
,它按你期望的那样工作。如果根本没有定义设置,valueForKey
将 return nil
,对 nil 调用 boolValue
将 return 另一个 nil,它被转换为 false;