ตรวจสอบว่า UserDefault มีอยู่หรือไม่ - Swift


87

ฉันกำลังพยายามตรวจสอบว่ามีค่าเริ่มต้นของผู้ใช้อยู่หรือไม่ดังที่แสดงด้านล่าง:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

อย่างไรก็ตามไม่มีวัสดุใดที่จะคืนค่าเป็นจริงได้เสมอแม้ว่าวัตถุนั้นจะยังไม่มีอยู่จริง? นี่เป็นวิธีที่ถูกต้องสำหรับการตรวจสอบการมีอยู่หรือไม่?

คำตอบ:


129

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
}

ทำงานแล้ว! แต่คุณลืมพารามิเตอร์ดังนั้นฉันจึงเพิ่มเข้าไป
Jesse Onolemen

21

ใช่นี้เป็นวิธีการที่เหมาะสมในการตรวจสอบoptionalได้nilหรือค่าobjectForKeyตอบแทนที่วิธีการซึ่งเป็นAnyObject?Implicit optional

ดังนั้นหากuserDefaults.objectForKey(kUSERID)มีค่าเกินกว่าที่ประเมินtrueไว้ หากuserDefaults.objectForKey(kUSERID)มีnilค่าเกินกว่าที่ประเมินfalseไว้

จากคู่มือการเขียนโปรแกรมที่รวดเร็ว

ถ้า Statements และ Forced Unwrapping คุณสามารถใช้คำสั่ง if เพื่อค้นหาว่าตัวเลือกนั้นมีค่าหรือไม่ หากทางเลือกมีค่าจะประเมินเป็นจริง หากไม่มีค่าเลยจะประเมินเป็นเท็จ

ตอนนี้มีข้อผิดพลาดในเครื่องจำลองมากกว่าหลังจากตั้งค่าคีย์userDefaultsแล้วพวกเขายังคงตั้งค่าไว้เสมอไม่ว่าคุณจะลบแอพของคุณคุณต้องรีเซ็ตตัวจำลอง

รีเซ็ตจำลองของคุณตรวจสอบวิธีการนี้ก่อนที่จะตั้งหลักในuserDefaultsหรือเอากุญแจuserDefaults.removeObjectForKey(kUSERID)จากuserDefaults และมันจะกลับNOอุปกรณ์ .On iOS8 beta4มันได้รับการแก้ไขใน


" objectForKeyวิธีการส่งคืนAnyObject!ซึ่งเป็นทางเลือกโดยนัย" ซึ่งไม่ถูกต้องมันส่งกลับAnyObject?
Leo Dabus

1
@LeoDabus Swift มีการเปลี่ยนแปลงหลายครั้ง ขอบคุณ BTW ฉันเปลี่ยนไปแล้ว
codester

ณ วันที่ 10/25/2016 บรรทัดในเอกสารตอนนี้ระบุว่า "คุณสามารถใช้คำสั่ง if เพื่อค้นหาว่าตัวเลือกมีค่าหรือไม่โดยการเปรียบเทียบตัวเลือกกับศูนย์คุณทำการเปรียบเทียบนี้กับโอเปอเรเตอร์“ เท่ากับ” (= =) หรือโอเปอเรเตอร์“ ไม่เท่ากับ” (! =) " Xcode 7.3.1 จะแสดงข้อผิดพลาดในการคอมไพล์หากคุณพยายามif anOptional { }และจะแนะนำให้คุณทดสอบโดยใช้ == nil หรือ! = nil
wyu

15

โดยพื้นฐานแล้วสิ่งนี้เหมือนกับที่แนะนำในคำตอบอื่น ๆ แต่เป็นวิธีที่สะดวกกว่า (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

Simple Code เพื่อตรวจสอบว่าค่าที่เก็บไว้ใน 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")
}


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

ถ้า 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.