如果userDefault为空,我试图拒绝访问某个 View Controller ,但是代码似乎无法正常工作。为了更清楚一点,我将收藏夹列表保存到userDefault中。这是我的代码:

 if UserDefaults.standard.array(forKey: "favorites") == nil {

        navigationController?.popToRootViewController(animated: true)
        return
    }

错误是索引超出范围,这意味着将忽略整个块(该块运行后的代码,并且由于用户默认值为空,因此在尝试检索不存在的信息时会崩溃)。

有趣的是,代码在我第一次尝试进入viewController时起作用(它拒绝我访问)。但是,如果我最喜欢标记一个对象(保存到userDefault),然后取消收藏同一对象(userDefault变为空),然后输入viewController,程序将崩溃。

我试过了:
if let favExist = UserDefaults.standard.array(forKey: "favorites") {
        print("")
        print("FAV EXISTS")
        print("")

    }else {
        print("")
        print("NOPE")
        print("")
        navigationController?.popToRootViewController(animated: true)
        return
    }

...同样的问题仍然存在。在print()中,日志告诉我“我喜欢的标记”,“然后我不喜欢的标记”之后“收藏夹存在”,然后尝试访问页面(即使userDefault现在应该为空)。

我也尝试过其他线程的代码。从另一个线程解决我的问题的建议代码是:
let defaults = UserDefaults.standard

    if (!defaults.bool(forKey: "favorites")) {
        defaults.set(true, forKey: "favorites")
    }

我不太确定如何实现它?我在哪里使用?它是做什么的?

知道有什么问题吗?

最佳答案

这样做就足够了:

if let favorites = UserDefaults.standard.array(forKey: "favorites") {
     // userDefault has a value
} else {
     // userDefault is nil (empty)
}

更新:
如果您的arrat也具有任何值,则需要在if语句中进行检查:
if let favorites = UserDefaults.standard.array(forKey: "favorites") {
    print("Favorites exists")

    if favorites.isEmpty {
        print("Favorites is empty")
    } else {
        print("Favorites is not empty, it has \(favorites.count) items")
    }
} else {
    print("Favorites is nil")
}

10-02 02:28