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 optionalhave nilor any value objectForKeymethod returns AnyObject?which is Implicit optional.
是的,这是检查optionalhasnil或任何值objectForKey方法返回的正确方法AnyObject?,即Implicit optional.
So if userDefaults.objectForKey(kUSERID)have any value than it evaluates to true. if userDefaults.objectForKey(kUSERID)has nilvalue 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 userDefaultsthey always remain set no matter you delete your app.You need to reset simulator.
现在模拟器中存在一个错误,而不是在设置密钥后,userDefaults无论您删除应用程序,它们始终保持设置状态。您需要重置模拟器。
Reset your Simulatorcheck this method before setting key in userDefaultsor remove key userDefaults.removeObjectForKey(kUSERID)from userDefaultsand 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"如果尚未为键设置值。

