Search code examples
swiftnsuserdefaultsoption-typeunwrap

Why cant I unwrap a UserDefault type string? [Swift 3.0 - Xcode 8]


I've stored data sent back by delegate as a user default and I'm trying to prepare it to send in a segue. I am able to send it in a segue, the problem I'm having is the data comes out in the form "optional[Data]" I know what optional means, but it doesn't let me unwrap UserDefault like an optional, even though it says it is optional?

Here's the code:

 func DataToPass(ArrayName: [String]) {
    print("Check ArrayContent--->",ArrayName)
    var DCollect = [String]()
    var CCollect = [String]()
    DCollect.append(ArrayName[0])
    CCollect.append(ArrayName[1])
    let defaults = UserDefaults.standard
    if let unwrap = defaults{
        unwrap.set(DCollect, forKey: "DCollect")
        unwrap.set(CCollect, forKey: "CCollect")
    }
}

The error is:

"Initializer for conditional binding must have Optional type, not 'UserDefaults'" on line if let unwrap = defaults{

Why can't I unwrap it like this?

Another Attempt:

    func DataToPass(ArrayName: [String]) {
        print("Check",ArrayName)
        UserDefaults.standard.set(ArrayName, forKey: "ToCollect")
        }


     override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        if segue.identifier == "SegueInfo"{
        let firstController = segue.destination as! ViewController
        if let Tosend = UserDefaults.standard.value(forKey: 
        "ToCollect") as? String {
        Collect.append(Tosend)
        }
        firstController.AllData = Collect
            }

Nothing is appended this way, Tosend is empty?


Solution

  • To save something to user defaults:

    UserDefaults.standard.set("It is a string", forKey: "meaningfulIdentifier")
    

    To get something out from user defaults:

    if let anyString = UserDefaults.standard.value(forKey: "meaningfulIdentifier") as? String {
        // Do something with anyString
    }
    


    You only need optional binding when you are dealing with getting something out from user defaults. For the data part you need this optional binding, not the User Defaults itself.