如何检查 userDefault 是否为空?
How do I check if userDefault is empty?
如果 userDefault 为空,我试图拒绝访问某个视图控制器,但代码似乎不起作用。为了更清楚一点,我将 favorite-list 保存到 userDefault。这是我的代码:
if UserDefaults.standard.array(forKey: "favorites") == nil {
navigationController?.popToRootViewController(animated: true)
return
}
错误是索引超出范围,这意味着整个块都被忽略(此块之后的代码运行并且由于用户默认为空,因此在尝试检索不存在的信息时崩溃)。
有趣的是,代码在我第一次尝试输入 viewController 时有效(它拒绝我访问)。但是如果我喜欢标记一个object(保存到userDefault),那么un-favorite同样是object(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() 中,日志告诉我 FAV EXISTS 在我最喜欢的标记之后,然后是 un-favorite 标记,然后尝试访问页面(即使 userDefault 现在应该是空的)。
我也试过其他线程的代码。从另一个线程解决我的问题的建议代码是:
let defaults = UserDefaults.standard
if (!defaults.bool(forKey: "favorites")) {
defaults.set(true, forKey: "favorites")
}
虽然我不太确定如何实施它?我在哪里使用它?它有什么作用?
知道哪里出了问题吗?
当您设置 UserDefaults 数组时,还将 BOOL 设置为 UserDefaults。当你恢复 Bool 时它不会崩溃,即使它没有被设置。
var favouritesset = UserDefaults.standard.bool(forKey: "favoritesset")
if favouritesset == true {
//Then Recover the Array
var array = UserDefaults.standard.array(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")
}
好的,Rashwan L 帮我解决了。事情是,我的代码(以及其他人建议的代码)检查了 userDefault 是否存在——它不关心是否存储了一个值。要解决此问题,我必须测试 favExist.count == 0 是否为真。如果为真,则用户将被阻止访问该页面并阻止访问其余代码。下面是:
if let favExist = UserDefaults.standard.array(forKey: "favorites") {
if(favExist.count == 0)
{
navigationController?.popToRootViewController(animated: true)
return
}
}else {
navigationController?.popToRootViewController(animated: true)
return
}
你喜欢这样:
if UserDefaults.standard.array(forKey: "favs") != nil {
// userDefault has a value
} else {
// userDefault is nil (empty)
}
如果 userDefault 为空,我试图拒绝访问某个视图控制器,但代码似乎不起作用。为了更清楚一点,我将 favorite-list 保存到 userDefault。这是我的代码:
if UserDefaults.standard.array(forKey: "favorites") == nil {
navigationController?.popToRootViewController(animated: true)
return
}
错误是索引超出范围,这意味着整个块都被忽略(此块之后的代码运行并且由于用户默认为空,因此在尝试检索不存在的信息时崩溃)。
有趣的是,代码在我第一次尝试输入 viewController 时有效(它拒绝我访问)。但是如果我喜欢标记一个object(保存到userDefault),那么un-favorite同样是object(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() 中,日志告诉我 FAV EXISTS 在我最喜欢的标记之后,然后是 un-favorite 标记,然后尝试访问页面(即使 userDefault 现在应该是空的)。
我也试过其他线程的代码。从另一个线程解决我的问题的建议代码是:
let defaults = UserDefaults.standard
if (!defaults.bool(forKey: "favorites")) {
defaults.set(true, forKey: "favorites")
}
虽然我不太确定如何实施它?我在哪里使用它?它有什么作用?
知道哪里出了问题吗?
当您设置 UserDefaults 数组时,还将 BOOL 设置为 UserDefaults。当你恢复 Bool 时它不会崩溃,即使它没有被设置。
var favouritesset = UserDefaults.standard.bool(forKey: "favoritesset")
if favouritesset == true {
//Then Recover the Array
var array = UserDefaults.standard.array(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")
}
好的,Rashwan L 帮我解决了。事情是,我的代码(以及其他人建议的代码)检查了 userDefault 是否存在——它不关心是否存储了一个值。要解决此问题,我必须测试 favExist.count == 0 是否为真。如果为真,则用户将被阻止访问该页面并阻止访问其余代码。下面是:
if let favExist = UserDefaults.standard.array(forKey: "favorites") {
if(favExist.count == 0)
{
navigationController?.popToRootViewController(animated: true)
return
}
}else {
navigationController?.popToRootViewController(animated: true)
return
}
你喜欢这样:
if UserDefaults.standard.array(forKey: "favs") != nil {
// userDefault has a value
} else {
// userDefault is nil (empty)
}