是强制实践强制解除从UserDefaults检索的可选值,而不是使用guard /如果让它安全解包?

时间:2016-08-22 03:11:45

标签: swift nsuserdefaults

许多在线教程似乎赞成使用if-letguard-let语句从UserDefaults中检索可选值。这有意义吗?我读到Apple打算让我们立即为UserDefaults提供默认值。

使用guard语句安全地解包这些值会导致更多代码,如果您的应用程序立即初始化这些值,这似乎是多余的。从UserDefaults强制解包值是否有任何缺点?

2 个答案:

答案 0 :(得分:5)

当您提供的密钥未定义时,返回nil对于UserDefaults来说是完全合理的。此外,当你说object(forKey:)没有明确的类型时从UserDefaults返回的值 - 从Xcode 8种子6开始,它是一个Any。使用if/guard let是一种在单个表达式中询问此值是否为非nil的方法,如果是,则是否可以将其转换为您期望的类型,而没有任何危险崩溃因此,这是伟大的继续进行的方式。 强制展开或强制投射。它安全展开,安全铸造。如果失败,则条件失败,并且没有造成伤害。

强制展开或强制施放会涉及使用感叹号(!)。当然,如果你绝对100%确定自己的理由,那么你完全可以自由地展开和强制施放。但请记住,感叹号的主要含义是“请让我崩溃!”当你的假设结果出错时,你不会感到惊讶,而Swift就是你所要做的。

答案 1 :(得分:2)

处理NSUserDefaults有两种不同的情况:

  • 如果您没有注册 NSUserDefaults中某个键的默认值,则返回的值可以是nil,您不能强制解包在他的回答中描述了 matt 的价值。

  • 但是,如果您<{>}注册 NSUserDefaults中某个键的默认值 - 正如Apple在documentation中所建议的那样 - 您可以放心地解开该值,因为框架可靠地返回默认值,以防&#34;物理&#34;缺少属性列表文件中的密钥。