UserDefault가 있는지 확인-Swift


87

아래에 표시된 사용자 기본값이 있는지 확인하려고합니다.

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

그러나 객체가 아직 존재하지 않더라도 항상 true를 반환하는 것은 무엇입니까? 이것이 존재를 확인하는 올바른 방법입니까?

답변:


127

Astun은 훌륭한 대답을 가지고 있습니다. 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

예, 이것은 optionalhave nil또는 any value objectForKey메서드 반환 을 확인하는 올바른 방법 AnyObject?입니다 Implicit optional.

따라서 userDefaults.objectForKey(kUSERID)평가되는 값보다 true. 경우 userDefaults.objectForKey(kUSERID)nil값을가로 평가보다 false.

신속한 프로그래밍 가이드에서

If 문 및 강제 풀기 if 문을 사용하여 옵션에 값이 포함되어 있는지 확인할 수 있습니다. 옵션에 값이 있으면 true로 평가됩니다. 값이 전혀 없으면 false로 평가됩니다.

이제 시뮬레이터에서 키를 설정 한 후보다 버그가있어 userDefaults앱을 삭제해도 항상 설정된 상태로 유지됩니다. 시뮬레이터를 재설정해야합니다.

당신의 시뮬레이터 리셋 에서 키를 설정하기 전에이 방법을 확인 userDefaults하거나 키를 제거 userDefaults.removeObjectForKey(kUSERID)에서 userDefaults 그것은 반환 NO이 해결됩니다 CSTE 연구진 장치 iOS8 beta4.


" objectForKey메서드 AnyObject!는 암시 적 선택 사항을 반환합니다. "이것은 반환 하는 것이 잘못되었습니다.AnyObject?
Leo

1
@LeoDabus Swift는 여러 번 변경되었습니다. 감사합니다 BTW 내가 그것을 변경했습니다.
codester

2016 년 10 월 25 일부터 문서의 줄에 "if 문을 사용하여 선택 사항을 nil과 비교하여 선택 사항에 값이 포함되어 있는지 확인할 수 있습니다."같음 "연산자 (= =) 또는 "같지 않음"연산자 (! =). " Xcode 7.3.1은 시도하면 컴파일 오류를 표시하며 if anOptional { }== nil 또는! = nil
wyu

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
쉽습니다

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

override 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.