【问题标题】:Swift 3 error when accessing NSUserDefaults, why?访问 NSUserDefaults 时出现 Swift 3 错误,为什么?
【发布时间】:2017-08-28 09:18:36
【问题描述】:

执行以下代码时出现致命错误:

 func dateChange()
{
    let dateNow = Date()
    var oldDate = defaults.object(forKey: "oldDate") as! Date 

这是我收到此错误的地方:线程 1:EXC_BREAKPOINT(code=1, subcode= 0x1002a91fc) 通过 UserDefaults 访问 oldDate 时。

    let timeDifference = dateNow.timeDifference(from: oldDate)

    if timeDifference > 1
    {
        let alert = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Schade", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)

        days = 0
        defaults.set(days, forKey: "days")
    }
    else if timeDifference == 1 && challengeCompleted == true
    {
        days += 1
        defaults.set(days, forKey: "days")
    }

    oldDate = dateNow
    defaults.set(oldDate, forKey: "oldDate")
}

我只是不明白为什么会收到此错误消息。访问此代码时我得到了同样的结果:

tvc.data = tvc.defaults.array(forKey: "data") as! [字符串]

在这种情况下,我正在从另一个视图控制器加载一个数组。

真正让我好奇的是,我只有在我的 iPhone 上运行应用程序时才会收到此消息,而不是在模拟器中。我只是不明白。谁能帮帮我?

感谢您的观看!

【问题讨论】:

    标签: ios swift error-handling swift3


    【解决方案1】:

    关于使用 force-unwrap 有一个很好的笑话“每次你在世界某个地方使用 force unwrap 时,一只小猫就会死去”。

    这意味着:不要使用强制展开。

    在你的例子中,

    var oldDate = defaults.object(forKey: "oldDate") as! Date,您正试图通过强制获得不存在的东西,显然如果它不存在,它将惨遭失败。

    有几种方法可以解决这个问题:

    1. 使用可选值

      var oldDate = defaults.object(forKey: "oldDate") as? Date
      
    2. 解开默认值中的值

      guard let date = defaults.object(forKey: "oldDate") as? Date else { return }
      

    常见的方法是return,以防解包不顺利,但你可以选择你想用它做什么。

    【讨论】:

      【解决方案2】:

      在解开可选值之前检查键中是否存在值:

      if let sample = defaults.object(forKey: "oldDate") as? Date
      {
          var oldDate = defaults.object(forKey: "oldDate") as! Date
      }
      

      【讨论】:

      • 您不需要 oldDate,因为示例现在将包含 oldDate 的默认值...
      • 没有工作:/实际上它工作了,但我在尝试使用它的地方仍然遇到错误......你知道问题可能是什么吗?因为我真的不明白。
      【解决方案3】:

      这可能是第一次启动应用程序,您还没有在用户默认值中为“oldDate”设置任何内容。这只会在用户第一次使用您的应用时为零。

      在 AppDelegate.swift 文件中,您可以将以下代码添加到 didFinishingLaunchingWithOptions

        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
          // Override point for customization after application launch.
          if UserDefaults.standard.object(forKey: "oldDate") == nil {
            UserDefaults.standard.setValue(Date(), forKey: "oldDate")
          }
          return true
        }
      

      【讨论】:

      • @Whazzup 很高兴为您提供帮助!
      猜你喜欢
      • 2019-07-14
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多