Swift技术问题:如何实现绑定UserDefaults的布尔变量的set方法
你的Swift UserDefaults绑定布尔变量的代码其实已经没问题啦!
嘿,先给你吃个定心丸:你写的set部分代码完全正确,这个计算属性已经能完美实现你想要的需求——给continuousPurchase赋值时,值会自动存入UserDefaults;读取这个变量时,会从UserDefaults里取出对应的值。
关于set的两种写法
你现在的写法是显式给set指定了参数名value,这完全符合Swift语法。当然,Swift也提供了更简洁的写法:省略参数名,直接用系统默认的newValue变量,效果是一样的,写法如下:
var continuousPurchase: Bool { get { UserDefaults.standard.bool(forKey: "continuousPurchase") } set { UserDefaults.standard.set(newValue, forKey: "continuousPurchase") } }
选哪种全看你个人习惯,怎么清晰怎么来。
优化小技巧:别硬写字符串Key
为了避免重复写Key字符串时不小心拼错(这种低级错误排查起来超烦),建议把Key提取成一个静态常量,比如放到UserDefaults的扩展里:
extension UserDefaults { static let continuousPurchaseKey = "continuousPurchase" } var continuousPurchase: Bool { get { UserDefaults.standard.bool(forKey: UserDefaults.continuousPurchaseKey) } set { UserDefaults.standard.set(newValue, forKey: UserDefaults.continuousPurchaseKey) } }
这样后续不管哪里用到这个Key,直接用常量就行,再也不用担心拼写错误啦。
额外补充:自定义默认值
默认情况下,如果UserDefaults里还没存过这个Key的值,bool(forKey:)会返回false。如果你想要自定义默认值(比如默认开启,也就是true),可以修改get部分的逻辑:
var continuousPurchase: Bool { get { // 这里用object(forKey:)先判断是否存在,不存在就返回自定义默认值true UserDefaults.standard.object(forKey: UserDefaults.continuousPurchaseKey) as? Bool ?? true } set { UserDefaults.standard.set(newValue, forKey: UserDefaults.continuousPurchaseKey) } }
这样你的代码不仅功能达标,还更健壮、更好维护~
内容的提问来源于stack exchange,提问作者Arash Etemad
相关产品推荐
相关产品推荐

