ios 检查 UserDefault 是否存在 - Swift
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25104700/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Check if UserDefault exists - Swift
提问by Ryan
I'm trying to check if the a user default exists, seen below:
我正在尝试检查用户默认值是否存在,如下所示:
func userAlreadyExist() -> Bool {
var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey(kUSERID) {
return true
}
return false
}
However, no mater what it will always return true even when the object doesn't exist yet? Is this the right way for checking existence ?
但是,无论如何,即使对象尚不存在,它也会始终返回 true 吗?这是检查存在的正确方法吗?
回答by user7248923
Astun has a great answer. See below for the Swift 3 version.
阿斯顿有一个很好的答案。请参阅下面的 Swift 3 版本。
func isKeyPresentInUserDefaults(key: String) -> Bool {
return UserDefaults.standard.object(forKey: key) != nil
}
回答by Astun
I copy/pasted your code but Xcode 6.1.1 was throwing some errors my way, it ended up looking like this and it works like a charm. Thanks!
我复制/粘贴了你的代码,但 Xcode 6.1.1 以我的方式抛出了一些错误,它最终看起来像这样,它就像一个魅力。谢谢!
func userAlreadyExist(kUsernameKey: String) -> Bool {
return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}
回答by codester
Yes this is right way to check the optional
have nil
or any value objectForKey
method returns AnyObject?
which is Implicit optional
.
是的,这是检查optional
hasnil
或任何值objectForKey
方法返回的正确方法AnyObject?
,即Implicit optional
.
So if userDefaults.objectForKey(kUSERID)
have any value than it evaluates to true
. if userDefaults.objectForKey(kUSERID)
has nil
value than it evaluates to false
.
所以如果userDefaults.objectForKey(kUSERID)
有任何价值比它评估为true
. 如果userDefaults.objectForKey(kUSERID)
有nil
值比它的计算结果false
。
From swift programming guide
来自 swift 编程指南
If Statements and Forced UnwrappingYou can use an if statement to find out whether an optional contains a value. If an optional does have a value, it evaluates to true; if it has no value at all, it evaluates to false.
If 语句和强制解包您可以使用 if 语句来确定一个可选项是否包含一个值。如果一个可选项确实有一个值,它的计算结果为真;如果它根本没有价值,则评估为假。
Now there is a bug in simulators than after setting key in userDefaults
they always remain set no matter you delete your app.You need to reset simulator.
现在模拟器中存在一个错误,而不是在设置密钥后,userDefaults
无论您删除应用程序,它们始终保持设置状态。您需要重置模拟器。
Reset your Simulatorcheck this method before setting key in userDefaults
or remove key userDefaults.removeObjectForKey(kUSERID)
from userDefaults
and it will return NO
.On devices it is resolved in iOS8 beta4
.
重置您的模拟器在设置密钥userDefaults
或userDefaults.removeObjectForKey(kUSERID)
从中删除密钥之前检查此方法userDefaults
,它将返回NO
。在设备上,它在iOS8 beta4
.
回答by Sir Codesalot
This is essentially the same as suggested in other answers but in a more convenient way (Swift 3+):
这与其他答案中的建议基本相同,但以更方便的方式(Swift 3+):
extension UserDefaults {
static func contains(_ key: String) -> Bool {
return UserDefaults.standard.object(forKey: key) != nil
}
}
usage: if UserDefaults.contains(kUSERID) { ... }
用法: if UserDefaults.contains(kUSERID) { ... }
回答by Sudhi 9135
Simple Code to check whether value stored in UserDefault.
检查值是否存储在 UserDefault 中的简单代码。
let userdefaults = UserDefaults.standard
if let savedValue = userdefaults.string(forKey: "key"){
print("Here you will get saved value")
} else {
print("No value in Userdefault,Either you can save value here or perform other operation")
userdefaults.set("Here you can save value", forKey: "key")
}
回答by Johny D Good
for swift 3.2
快速 3.2
func userAlreadyExist(kUsernameKey: String) -> Bool {
return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}
回答by Jamil Hasnine Tamim
public class PreferencesUtils {
private init() {
}
public static func setBoolData(boolValue: Bool, dataName: String) {
UserDefaults.standard.set(boolValue, forKey: dataName)
}
public static func getBoolData(dataName: String)-> Bool{
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil) {
return defaults.value(forKey: dataName)! as! Bool
} else {
return false
}
}
public static func saveStringData(data: String, dataName: String){
let preferences = UserDefaults.standard
preferences.set(data, forKey: dataName)
let didSave = preferences.synchronize()
if !didSave {
debugPrint("Not saved yet")
}
}
public static func getSavedStringData(dataName: String)-> String{
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil){
return defaults.value(forKey: dataName) as! String
} else {
return ""
}
}
public static func saveIntData(data : Int, dataName: String){
let preferences = UserDefaults.standard
preferences.set(data, forKey: dataName)
let didSave = preferences.synchronize()
if !didSave {
debugPrint("Not saved yet")
}
}
public static func getSavedIntData(dataName: String) -> Int {
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil){
return defaults.value(forKey: dataName) as! Int
}else{
return 0
}
}
}
Or you can try this library: Link
或者你可以试试这个库:链接
回答by Andrea Leganza
func keyExists(key: String) -> Bool {
guard let _ = UserDefaults.standard.object(forKey: key) {
return false;
}
return true;
}
回答by hamayun zeb
override func viewDidLoad() {
覆盖 func viewDidLoad() {
super.viewDidLoad()
super.viewDidLoad()
if UserDefaults.standard.string(forKey: "CHARRY") == "CHARRY"{
if UserDefaults.standard.string(forKey: "CHARRY") == "CHARRY"{
lb.text = "CHARRY"
im.image = UIImage(named: "CHARRY")
} }
} }
@IBAction func PressedCar(_ sender: UIButton){
lb.text = "CHARRY"
im.image = UIImage(named: "CHARRY")
UserDefaults.standard.set("CAR", forKey: "CHARRY")
}
回答by Xavier Lowmiller
Many of the solutions here are valid. Still, I think they solve the wrong problem.
这里的许多解决方案都是有效的。尽管如此,我认为他们解决了错误的问题。
Usually, code like this is used to check if a value is set so another default value can be used:
通常,像这样的代码用于检查是否设置了一个值,以便可以使用另一个默认值:
if isKeyPresentInUserDefaults(key: "username") {
return UserDefaults.standard.string(forKey: "username")
} else {
return "No username was set"
}
You shouldn't care if a key is set or not. There is a far more elegant approach for having default values in UserDefaults
:
您不应该关心是否设置了密钥。有一种更优雅的方法来设置默认值UserDefaults
:
UserDefault.standard.register(defaults: ["username": "No username was set"])
If you run this code at app launch, subsequent calls to UserDefaults.standard.string(forKey: "username")
will return the default value of "No username was set"
if no value was set for the key yet.
如果您在应用程序启动时运行此代码,则后续调用UserDefaults.standard.string(forKey: "username")
将返回默认值"No username was set"
如果尚未为键设置值。