许多在线教程似乎赞成使用if-let
或guard-let
语句从UserDefaults中检索可选值。这有意义吗?我读到Apple打算让我们立即为UserDefaults提供默认值。
使用guard语句安全地解包这些值会导致更多代码,如果您的应用程序立即初始化这些值,这似乎是多余的。从UserDefaults强制解包值是否有任何缺点?
答案 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;缺少属性列表文件中的密钥。