调用 setObject(_:forKey:) 时,布尔值是否会桥接到 NSNumber在 NSUserDefaults



NSUserDefaults类参考中,我找到了以下句子:

func setObject(_ value: AnyObject?, forKey defaultName: String(

value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,其内容必须是属性列表对象。

如果我在 Swift 中用布尔值调用该方法,它会被桥接到NSNumber吗?我必须打电话给setBool吗?那么IntFloatDouble呢?

PS:我在我的项目中尝试过。当我打电话给objectForKey() as! Bool时,它有时会崩溃,有时不会。我不确定发生了什么,所以我问了这个问题。

Swift Bool 桥接到 Objective-C NSNumber。如果您不想依赖隐式强制转换(您不应该依赖,因为它会在 Swift 3 中消失(,请通过说 myBool as NSNumber 来自己转换它。但我向你保证,在你的代码中,它是隐式转换的。

反过来

,NSNumber 被桥接到 Swift Bool,但它必须以某种方式被明确地抛弃。如果你说as! Bool,你就要求崩溃——你要求在任何时候你说as!崩溃——所以如果你不想崩溃,就不要这么说。还有许多其他方法可以安全铸造,包括 boolForKey .

但是,崩溃与您称呼setObject:forKey:的方式无关。这与你说as!以另一种方式回来的事实有关,当时要么没有这样的键,要么该键的值不是包装布尔值的 NSNumber。你没有展示你的整个代码(事实上,你没有展示你的任何代码(,所以没有什么建设性的。

如果要存储 BOOL,则必须调用 setBool ,因为setObject将对象作为参数。

BOOL、Int、Float 等是不是对象的基元类型。

最新更新