swift - 无法更新 NSMutableDictionary?

标签 swift nsmutabledictionary

我不明白为什么我会在这个方法上遇到错误:

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/

相关文章:

swift - 使用 ORSSerialPort 时类型 'AppDelegate' 不符合协议(protocol) 'ORSSerialPortDelegate'

ios - Swift:与点 (".") 文字相关的自定义运算符的优先级

ios - NSMutableDictionary 中存储的 NSMutableArray 变空?

ios - 使用自定义对象从数组构建不可变的 NSDictionary,其中每个键可以有多个对象

ios - 在 Swift REPL 中使用 iphonesimulator sdk 和 macosx sdk 有什么区别?

ios - 如何以编程方式在 View Controller 之间传递数据?我想将 UITextfield 数据传递给另一个 View Controller

ios - 为什么我以编程方式添加的 UIView 没有连接到我的 UIViewController?

ios - 如何从 detailViewController 填充数组并返回到 iOS 中的 masterViewController?

ios - 收到内存警告的未知原因