我不明白为什么我会在这个方法上遇到错误:
let loginCountKey = "loginCount"
let appReviewParamsKey = "appReviewParams"
func resetLoginCount() {
let defaults = NSUserDefaults.standardUserDefaults()
if let reviewParameters = defaults.valueForKey(appReviewParamsKey) as? NSMutableDictionary {
reviewParameters[loginCountKey] = 1
defaults.setObject(reviewParameters, forKey: appReviewParamsKey)
defaults.synchronize()
}
}
setObject 行给我一个错误:caught "NSInternalInconsistencyException", ... mutating method sent to immutable object"
调试时,reviewParameters 显示为 NSMutableDictionary。我还尝试了一个 if var 而不是 if let(虽然它应该是不必要的)并得到了同样的错误。
我还尝试将值设置为 NSNumber(int: 1) 而不是 1。
为什么这会导致给定的错误?
最佳答案
有两个问题:
NSUserDefaults
在转换为 Foundation 类型时返回不可变对象(immutable对象)- 即使返回的值是可变的,您也将其分配给一个常量 (let),这使得该对象在 Swift 中不可变。
在 Swift 中,推荐的方法是使用原生 Swift 类型和变量 (var),例如
func resetLoginCount() {
let defaults = NSUserDefaults.standardUserDefaults()
if var reviewParameters = defaults.objectForKey(appReviewParamsKey) as? [String:AnyObject] {
reviewParameters[loginCountKey] = 1
defaults.setObject(reviewParameters, forKey: appReviewParamsKey)
defaults.synchronize()
}
}
关于swift - 无法更新 NSMutableDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35187326/