UserDefaultが存在するかどうかを確認します-Swift


87

以下に示すように、ユーザーのデフォルトが存在するかどうかを確認しようとしています。

func userAlreadyExist() -> Bool {
    var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

ただし、オブジェクトがまだ存在しない場合でも、常にtrueを返すものはありませんか?これは存在を確認するための正しい方法ですか?

回答:


127

アストゥンには素晴らしい答えがあります。Swift 3バージョンについては、以下を参照してください。

func isKeyPresentInUserDefaults(key: String) -> Bool {
    return UserDefaults.standard.object(forKey: key) != nil
}

29

コードをコピーして貼り付けましたが、Xcode 6.1.1がエラーをスローしていたため、このようになり、チャームのように機能しました。ありがとう!

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}

働いた!私はこれを追加しましたので、しかし、あなたはパラメータを忘れてしまった。
ジェシーOnolemen

21

はい、これは、optionalhavenilまたはanyvalueobjectForKeyメソッドが返す値をチェックする正しい方法AnyObject?ですImplicit optional

したがって、userDefaults.objectForKey(kUSERID)評価値よりも値がある場合true。もしuserDefaults.objectForKey(kUSERID)持ってnil、それが評価されるよりも、値をfalse

迅速なプログラミングガイドから

ifステートメントと強制アンラップ ifステートメントを使用して、オプションに値が含まれているかどうかを確認できます。オプションに値がある場合、それはtrueと評価されます。値がまったくない場合は、falseと評価されます。

シミュレーターにバグがあり、キーを設定した後userDefaults、アプリを削除しても常に設定されたままになります。シミュレーターをリセットする必要があります。

シミュレータをリセットして、キーを設定する前にこのメソッドをチェックするuserDefaultsか、キーuserDefaults.removeObjectForKey(kUSERID)を削除するuserDefaults と、が返さNOiOS8 beta4ます。デバイスでは、で解決されます。


「暗黙のオプションであるobjectForKeyメソッドが返さAnyObject!れます」これは間違っていますAnyObject?
Leo Dabus 2016年

1
@LeoDabusSwiftは何度も変更されました。ところで、私はそれを変更しました。
codester 2016年

2016年10月25日の時点で、ドキュメントの行には、「ifステートメントを使用して、オプションをnilと比較することにより、オプションに値が含まれているかどうかを確認できます。この比較は、「等しい」演算子(= =)または「等しくない」演算子(!=)。」Xcode 7.3.1を実行しようとするif anOptional { }と、コンパイルエラーが表示され、== nilまたは!= nil
wyu 2016年

14

これは基本的に他の回答で提案されているものと同じですが、より便利な方法です(Swift 3+):

extension UserDefaults {
    static func contains(_ key: String) -> Bool {
        return UserDefaults.standard.object(forKey: key) != nil
    }
}

使用法: if UserDefaults.contains(kUSERID) { ... }


次に、シングルトン標準にアクセスしているので、関数を静的にするのは理にかなっています:static func contains(key: String) -> Bool。それ以外の場合は、作成する方が理にかなっていますreturn self.object(forKey: key) != nil
Nomad Developer

5

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")
}

2

迅速な3.2の場合

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return UserDefaults.standard.object(forKey: kUsernameKey) != nil
}

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
        }
    }

}

または、このライブラリを試すことができます:リンク


0
func keyExists(key: String) -> Bool {
    guard let _ = UserDefaults.standard.object(forKey: key) {
     return false;
    }

   return true;
}

回答としてコードを投稿するだけでなく、コードの機能と質問への回答方法についても説明してください。説明付きの回答は通常、より有用で質が高く、賛成票を集める可能性が高くなります。
Mark Rotteveel

0

func viewDidLoad()をオーバーライドする{

super.viewDidLoad()

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")


}

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"、キーにまだ値が設定されていない場合のデフォルト値が返されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.