在NSUserDefaults上调用setObject(_:forKey :)时,Bool会桥接到NSNumber吗?

时间:2016-05-15 13:23:47

标签: swift 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时,它有时会崩溃而有时则没有。我不确定发生了什么,所以我问了这个问题。

2 个答案:

答案 0 :(得分:1)

Swift Bool桥接到Objective-C NSNumber。如果你不想依赖隐式投射(你不应该,因为它会在Swift 3中消失),你可以自己说myBool as NSNumber。但我向你保证,在你的代码中, 被隐式转换。

回到另一个方向,NSNumber与Swift Bool桥接,但必须以某种方式明确地抛弃它。如果您说as! Bool,那么您要求崩溃 - 您要求任何时间崩溃as! - 所以如果您不想崩溃,请不要崩溃。这么说。还有许多其他方法可以安全施放,包括boolForKey

然而,崩溃与您调用setObject:forKey:的方式无关。它与你说as!以另一种方式回来的事实有关,那时,要么没有这样的密钥,要么密钥的值不是包含Bool的NSNumber。你没有展示整个代码(事实上,你没有展示任何代码),所以没有任何建设性可言。

答案 1 :(得分:-1)

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

BOOL,Int,Float等是非对象的原始类型。