我正在尝试检查用户默认是否存在,如下所示:
func userAlreadyExist() -> Bool {
var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey(kUSERID) {
return true
}
return false
}
然而,即使对象不存在,它也总是会返回真实的东西吗?这是检查存在的正确方法吗?
答案 0 :(得分:82)
Astun有一个很好的答案。请参阅下面的Swift 3版本。
func isKeyPresentInUserDefaults(key: String) -> Bool {
return UserDefaults.standard.object(forKey: key) != nil
}
答案 1 :(得分:28)
我复制/粘贴了你的代码,但Xcode 6.1.1却以我的方式抛出了一些错误,它看起来像这样,它就像一个魅力。谢谢!
func userAlreadyExist(kUsernameKey: String) -> Bool {
return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}
答案 2 :(得分:21)
是的,这是检查optional
nil
或objectForKey
方法返回AnyObject?
Implicit optional
的正确方法。
因此,如果userDefaults.objectForKey(kUSERID)
具有任何值,则其值为true
。如果userDefaults.objectForKey(kUSERID)
的值为nil
,则其值为false
。
来自swift编程guide
如果语句和强制解包 您可以使用if语句来确定可选项是否包含值。如果可选项具有值,则计算结果为 真正;如果它根本没有值,则评估为false。
现在模拟器中存在一个错误,而不是在userDefaults
中设置密钥后,无论你删除你的应用程序,它们都会保持设置。你需要重置模拟器。
重置模拟器检查此方法,然后在userDefaults
中设置密钥或从userDefaults.removeObjectForKey(kUSERID)
中删除密钥userDefaults
它将返回NO
。在设备上,它会在iOS8 beta4
中解析。
答案 3 :(得分:4)
简单代码,用于检查是否存储在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")
}
答案 4 :(得分:2)
for swift 3.2
func userAlreadyExist(kUsernameKey: String) -> Bool {
return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}
答案 5 :(得分:0)
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
}
}
}
或者您可以尝试以下库:Link
答案 6 :(得分:0)
func keyExists(key: String) -> Bool {
guard let _ = UserDefaults.standard.object(forKey: key) {
return false;
}
return true;
}
答案 7 :(得分:0)
覆盖func viewDidLoad() {
super.viewDidLoad()
如果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")
}
答案 8 :(得分:0)
这里的许多解决方案都是有效的。不过,我认为他们解决了错误的问题。
通常,这样的代码用于检查是否设置了值,以便可以使用另一个默认值:
if isKeyPresentInUserDefaults(key: "username") {
return UserDefaults.standard.string(forKey: "username")
} else {
return "No username was set"
}
您不必关心是否设置了键。在UserDefaults
中具有默认值的方法更优雅:
UserDefault.standard.register(defaults: ["username": "No username was set"])
如果您在应用启动时运行此代码,则如果尚未为密钥设置任何值,则随后对UserDefaults.standard.string(forKey: "username")
的调用将返回默认值"No username was set"
。