Swift - How to set initial value for NSUserDefaults

IosSwiftNsuserdefaultsUiswitch

Ios Problem Overview


I have a switch called soundSwitch, I'm saving the state of the button using an userDefault as such:

@IBAction func soundsChanged(sender: AnyObject) {
        if soundSwitch.on{
            defaults.setBool(true, forKey: "SoundActive")
            print("Sound ON")
        }else{
            defaults.setBool(false, forKey: "SoundActive")
            print("Sound OFF")
        }
    }

Currently, the actual default value is initially false when the user first launches the application.

How can I implement the defaults to be true if the user launches the app and they haven't been configured yet.

I've seen methods in Objective-C, but nothing in Swift. From what I've seen you can do it in the app delegate somehow, or in a PList file. How do I do either of those ones?

Ios Solutions


Solution 1 - Ios

Swift 3 syntax example

Register a boolean default value:

UserDefaults.standard.register(defaults: ["SoundActive" : true])

And to get the value:

UserDefaults.standard.bool(forKey: "SoundActive")

Sidenote: Although the above code will return true, note that the value isn't actually written to disk until you set it:

UserDefaults.standard.set(true, forKey: "SoundActive")

Solution 2 - Ios

Add this to your didFinishLaunchingWithOptions method from the AppDelegate. As some others pointed out try not to abuse by putting everything in this method.

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    ///	Here you can give default values to your UserDefault keys
    UserDefaults.standard.register(defaults: [
        "SoundActive": true,
        "someOtherKey": "Some Message"
        ])
}

Solution 3 - Ios

Swift 4

I prefer to implement a function similar to UserDefaults.string(forKey: ) which returns nil if the value is not set. Combined with the ?? operator, you don't need to have any default values written to disk unless you explicitly set them later.

extension UserDefaults {

    public func optionalInt(forKey defaultName: String) -> Int? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Int
        }
        return nil
    }

    public func optionalBool(forKey defaultName: String) -> Bool? {
        let defaults = self
        if let value = defaults.value(forKey: defaultName) {
            return value as? Bool
        }
        return nil
    }
}

Then you can retrieve your default values as follows

let defaults = UserDefaults.standard
let userName = defaults.string(forKey: "Username") ?? "Happy"
let userAge = defaults.optionalInt(forKey: "Age") ?? 21
let isSmart = defaults.optionalBool(forKey: "Smart") ?? true

Solution 4 - Ios

Using "registerDefaults" you can set Default value of NSUserDefaults

let userDefaultsDefaults = [
            "SoundActive" : true
        ]
        
NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults)

Note: write this in didFinishLaunchingWithOptions, so default value is set.

write below code where you want to check

 let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool!
        
 if (onoroff != nil && onoroff == false)
 {
    self.checkForAgreement()
 }

Solution 5 - Ios

There is nothing swift or app delegate specific.

Initial defaults are set by calling registerDefaults: on the standardUserDefaults instance.

You can make this call multiple times and I'd recommend that you don't do it in the app delegate, instead register appropriate details at appropriate times in the app, so if you have 1 view controller / subsystem which uses certain defaults values then register the default values as part of the initialisation if that code.

Only if you have something which is used by multiple different parts of the code should you consider doing that in the app delegate, and then only if you don't have some other appropriate controller in which to do it.

Solution 6 - Ios

func lastStatus() -> Bool {
    let defaultValue = true
    if let value = default.valueForKey("SoundActive") {
        // then use it
        return value as? Bool ?? defaultValue
    } else {
        // oh, no value?
        return defaultValue
    }
}

I think this is best way of using it. Also register(defaults:) will help, but in documentation Apple suggest to using it as fallback, like separating situation of no value and default value. Depend on your need.

Solution 7 - Ios

You can encapsulate all of your UserDefaults logic into a property variable that automatically registers the application default and saves any updates back into the user defaults dictionary. This is especially convenient if other parts of the app (besides the switch control) also read or change this state.

Swift 5 — The first part executes a closure to initialize the property, and the second part is the didSet block which is called automatically any time the property is changed.

var soundIsActive: Bool = {
        // Register the app default:
        UserDefaults.standard.register(defaults: ["SoundActive" : true])
        
        // Initialize the property with the current user default:
        return UserDefaults.standard.bool(forKey: "SoundActive")
    }()
    {
        didSet {
            // Update user default when the variable is set:
            UserDefaults.standard.set(soundIsActive, forKey: "SoundActive")
        }
    }

Solution 8 - Ios

If you really want to do it this way, put this in the AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.valueForKey("SoundActive") == nil {
        defaults.setBool(true, forKey: "SoundActive")
    }

If it is just used in the one viewcontroller, consider putting the code in the viewDidLoad method instead!

Solution 9 - Ios

Generic version of how to set a default value:

enum UserDefaultsKeys: String {
    case username = "kUsername"
}

extension UserDefaults {
    func optionalValue<T>(forKey key: UserDefaultsKeys) -> T? {
        if let value = self.value(forKey: key.rawValue) {
            return value as? T
        }
        return nil
    }
}

let username = defaults.optionalValue(forKey: .username) ?? ""

Solution 10 - Ios

Put this in your "didFinishLaunchingWithOptions" in your AppDelegate.

if defaults.valueForKey("launchedAlready") == true {
       print("Not first launch.")
    }
    else {
       defaults.setValue(true, forKey: "launchedAlready")
        defaults.setBool(true, forKey: "SoundActive")
        print("Sound ON")
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBig Green AlligatorView Question on Stackoverflow
Solution 1 - IosNoviView Answer on Stackoverflow
Solution 2 - Iosfs_tigreView Answer on Stackoverflow
Solution 3 - IosGuy BrookerView Answer on Stackoverflow
Solution 4 - IosHardik ThakkarView Answer on Stackoverflow
Solution 5 - IosWainView Answer on Stackoverflow
Solution 6 - IosKlein MiokeView Answer on Stackoverflow
Solution 7 - IosRobin StewartView Answer on Stackoverflow
Solution 8 - IosDominicView Answer on Stackoverflow
Solution 9 - IosPavel BogartView Answer on Stackoverflow
Solution 10 - IosAMAN77View Answer on Stackoverflow