在NSUserDefaults
班级参考中,我找到以下句子:
func setObject(_ value:AnyObject?,forKey defaultName:String)
value参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。
如果我在Swift中使用布尔值调用该方法,它是否会桥接到NSNumber
?我必须拨打setBool
吗?那么Int
,Float
和Double
呢?
PS:我在我的项目中尝试过。当我打电话给objectForKey() as! Bool
时,它有时会崩溃而有时则没有。我不确定发生了什么,所以我问了这个问题。
答案 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等是非对象的原始类型。