Swift 4中Int相加方法及UserDefaults存数相加报错求助
解决UserDefaults累加数字时的可选类型错误
这个问题我做项目的时候也踩过坑,核心原因就是Swift的可选类型(Optional)不能直接参与算术运算,咱们拆解一下问题,再给出几种实用的解决办法:
为什么会报错?
当你从UserDefaults读取数值时,如果用object(forKey:)再转成Int?(或者不小心把值处理成了可选类型),得到的结果是Int?——因为系统无法保证这个键一定存在对应的数值。而Swift是强类型语言,不允许直接对两个可选值(或可选值与非可选值)使用+运算符,这就是你看到'Binary operator '+' cannot be applied to two 'Int?' operands'错误的根本原因。
实用解决方法
方法1:用系统自带的integer(forKey:)直接获取非可选值
这是最简单的方式,UserDefaults的integer(forKey:)方法本身会在键不存在时返回0,直接拿到非可选的Int,可以直接累加:
// 读取当前值,无则返回0 var currentNum = UserDefaults.standard.integer(forKey: "myNumber") // 执行累加 currentNum += 1 // 存回UserDefaults UserDefaults.standard.set(currentNum, forKey: "myNumber")
方法2:用空合并运算符(??)给可选值兜底
如果你是用object(forKey:)读取(比如需要兼容其他类型),可以用??给可选值设置默认值,把它转成非可选Int:
// 读取值,为空则默认0 let currentNum = UserDefaults.standard.object(forKey: "myNumber") as? Int ?? 0 // 累加后存回 UserDefaults.standard.set(currentNum + 1, forKey: "myNumber")
方法3:可选绑定(if let/guard let)安全解包
如果需要区分“值存在”和“值不存在”的场景(比如第一次启动应用时初始化特定值),可以用可选绑定明确处理两种情况:
// if let版本:存在则累加,不存在则初始化 if let currentNum = UserDefaults.standard.object(forKey: "myNumber") as? Int { UserDefaults.standard.set(currentNum + 1, forKey: "myNumber") } else { // 第一次使用,设为初始值比如1 UserDefaults.standard.set(1, forKey: "myNumber") } // guard let版本:提前处理不存在的情况,代码更清爽 guard let currentNum = UserDefaults.standard.object(forKey: "myNumber") as? Int else { UserDefaults.standard.set(1, forKey: "myNumber") return } UserDefaults.standard.set(currentNum + 1, forKey: "myNumber")
进阶:封装扩展简化操作
如果你的项目里需要多次做这种累加操作,可以给UserDefaults写个扩展,把逻辑封装起来,避免重复代码:
extension UserDefaults { /// 对指定key的整数进行累加操作 func incrementInteger(forKey key: String) { let currentValue = self.integer(forKey: key) self.set(currentValue + 1, forKey: key) } }
使用的时候只需要一行代码:
UserDefaults.standard.incrementInteger(forKey: "myNumber")
小提醒
不需要每次调用set后都手动调用synchronize(),系统会自动同步到磁盘;只有在需要立即确保数据写入(比如应用即将退到后台)时,才需要调用这个方法。
内容的提问来源于stack exchange,提问作者N.Lucas
相关产品推荐
相关产品推荐

