Kiểm tra xem UserDefault có tồn tại không - Swift


87

Tôi đang cố gắng kiểm tra xem mặc định của người dùng có tồn tại hay không, xem bên dưới:

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

Tuy nhiên, không có trường hợp nào nó sẽ luôn trả về true ngay cả khi đối tượng chưa tồn tại? Đây có phải là cách thích hợp để kiểm tra sự tồn tại?

Câu trả lời:


127

Astun có một câu trả lời tuyệt vời. Xem bên dưới để biết phiên bản Swift 3.

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

29

Tôi đã sao chép / dán mã của bạn nhưng Xcode 6.1.1 đã gặp một số lỗi theo cách của tôi, cuối cùng nó trông như thế này và nó hoạt động như một sự quyến rũ. Cảm ơn!

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

Đã làm việc! Nhưng bạn quên tham số vì vậy tôi thêm nó vào.
Jesse Onolemen

21

Có điều này là đúng cách để kiểm tra optionalnilhay bất kỳ giá trị objectForKeytrở về phương pháp AnyObject?đó làImplicit optional .

Vì vậy, nếu userDefaults.objectForKey(kUSERID)có bất kỳ giá trị nào hơn nó được đánh giá true. nếu userDefaults.objectForKey(kUSERID)nilgiá trị hơn giá trị của nó false.

Từ hướng dẫn lập trình nhanh

Câu lệnh if và Buộc mở gói Bạn có thể sử dụng câu lệnh if để tìm hiểu xem một tùy chọn có chứa giá trị hay không. Nếu một tùy chọn không có giá trị, nó sẽ đánh giá là true; nếu nó không có giá trị nào, nó sẽ đánh giá là false.

Bây giờ có một lỗi trong trình mô phỏng so với sau khi thiết lập khóa, userDefaultschúng luôn được đặt cho dù bạn xóa ứng dụng của mình. Bạn cần phải đặt lại trình mô phỏng.

Đặt lại Trình mô phỏng của bạn, hãy kiểm tra phương pháp này trước khi đặt khóa userDefaultshoặc xóa khóa userDefaults.removeObjectForKey(kUSERID)khỏi userDefaults và nó sẽ trở lại NO. Trên các thiết bị, nó được giải quyết iOS8 beta4.


" objectForKeyPhương pháp lợi nhuận AnyObject!mà là Implicit tùy chọn" Đây là sai nó trảAnyObject?
Leo Dabus

1
@LeoDabus Swift đã thay đổi rất nhiều lần. Cảm ơn BTW Tôi đã thay đổi điều đó.
codester

kể từ ngày 25/10/2016, dòng trong tài liệu hiện có nội dung "Bạn có thể sử dụng câu lệnh if để tìm hiểu xem tùy chọn có chứa giá trị hay không bằng cách so sánh tùy chọn với nil. Bạn thực hiện so sánh này với toán tử“ bằng với ”(= =) hoặc toán tử “không bằng” (! =). " Xcode 7.3.1 sẽ hiển thị một lỗi biên dịch nếu bạn cố gắng if anOptional { }! Và nó sẽ đề nghị bạn kiểm tra sử dụng == nil hoặc = nil
wyu

14

Điều này về cơ bản giống như được đề xuất trong các câu trả lời khác nhưng theo cách thuận tiện hơn (Swift 3+):

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

sử dụng: if UserDefaults.contains(kUSERID) { ... }


sau đó nó làm cho tinh thần để thực hiện chức năng tĩnh bởi vì bạn đang truy cập vào một singleton tiêu chuẩn : static func contains(key: String) -> Bool. Nếu không, sẽ hợp lý hơnreturn self.object(forKey: key) != nil
Nomad Developer

5

Mã đơn giản để kiểm tra xem giá trị có được lưu trữ trong UserDefault hay không.

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

cho nhanh chóng 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
        }
    }

}

Hoặc bạn có thể thử thư viện này: Liên kết


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

   return true;
}

Vui lòng không chỉ đăng mã dưới dạng câu trả lời, mà hãy cung cấp giải thích mã của bạn có chức năng gì và cách nó trả lời câu hỏi. Các câu trả lời kèm theo lời giải thích thường hữu ích hơn và có chất lượng tốt hơn, đồng thời có nhiều khả năng thu hút sự ủng hộ hơn.
Đánh dấu Rotteveel

0

ghi đè 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

Nhiều giải pháp ở đây là hợp lệ. Tuy nhiên, tôi nghĩ rằng họ giải quyết vấn đề sai.

Thông thường, mã như thế này được sử dụng để kiểm tra xem một giá trị có được đặt hay không để một giá trị mặc định khác có thể được sử dụng:

if isKeyPresentInUserDefaults(key: "username") {
    return UserDefaults.standard.string(forKey: "username")
} else {
    return "No username was set"
}

Bạn không nên quan tâm xem khóa có được đặt hay không. Có một cách tiếp cận thanh lịch hơn nhiều để có các giá trị mặc định trong UserDefaults:

UserDefault.standard.register(defaults: ["username": "No username was set"])

Nếu bạn chạy mã này khi khởi chạy ứng dụng, các lệnh gọi tiếp theo UserDefaults.standard.string(forKey: "username")sẽ trả về giá trị mặc định "No username was set"nếu chưa có giá trị nào được đặt cho khóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.