Geno
Geno

Reputation: 37

nil Check in User Defaults (Swift 5)

I have a single image stored in UserDefaults, but until a user sets it, UserDefaults is empty. I need to check

If UserDefaults is empty and if it is, display an image.

Right now on a fresh app install until a user sets an image into UserDefaults, the app crashed.

My decode is working perfectly after I set an image in UserDefaults, just the code checking for nil is the problem.

I've only been learning swift for a month and I am stuck in this scenario.

here is my code:

 //Image Decode
 let Data = UserDefaults.standdard.object(forKey: "savedImage" as! NSData){

    if (Data as Data?) != nil {

      //display Image
       dogImageView.image = UIImage(data: Data as Data)

     }else {
         dogImageView.image = Image Literal
     }
 }

Upvotes: 1

Views: 2473

Answers (2)

Jamil Hasnine Tamim
Jamil Hasnine Tamim

Reputation: 4448

For swift 4.2, swift 5+

Write a class like:

import Foundation

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

}

Usage:

Save your data in preferences with line:

PreferencesUtils.saveStringData(data: "YOUR_DATA", dataName: "YOUR_KEY")

and for get this saved data :

PreferencesUtils.getSavedStringData(dataName: "YOUR_KEY")

Or check this library: Link

Upvotes: 1

Keshu R.
Keshu R.

Reputation: 5215

Use If-let to safaely unwrap optional.

    if let data = UserDefaults.standard.data(forKey: "savedImage") { // image is present 
        dogImageView.image = UIImage(data: data)
    } else { // image is not present. set a default image
        dogImageView.image = Image Literal
    }

Upvotes: 3

Related Questions