mforrest
mforrest

Reputation: 104

Swift Optionals - Unexpectedly found nil when unwrapping an optional value

I'm new to Swift and have been trying to wrap (ha) my head around optional values. As far as I can see - although I'm probably wrong - variables can be optional and therefore contain a nil value and these have to be accounted for in code.

Whenever I hit the 'save' button in my application I get the error: 'fatal error: unexpectedly found nil while unwrapping an Optional value'.

@IBAction func saveTapped(sender: AnyObject) {

    //code to save fillup to Parse backend

    // if variable is not nil
    if let username = PFUser.currentUser()?.username {

        // set username equal to current user
        self.object.username = username

    }else{

        println("PFUser.currentUser()?.username contained a nil value.")

    }

    // if variable is not nil
    if let amount = self.amountTextField.text {

        //set amount equal to value in amountTextField
        self.object.amount = self.amountTextField.text

    }else{

        println("self.amountTextField.text contained a nil value.")

    }

    // if variable is not nil
    if let cost = self.costTextField.text {

        // set cost equal to the value in costTextField
        self.object.cost = self.costTextField.text

    }else{

        println("self.costTextField.text contained a nil value.")

    }

    // set date equal to the current date
    self.object.date = self.date

    //save the object
    self.object.saveEventually { (success, error) -> Void in

        if error == nil {

            println("Object saved!")

        }else{

            println(error?.userInfo)

        }


    }

    // unwind back to root view controller
    self.navigationController?.popToRootViewControllerAnimated(true)

}

Not sure if the error is because of something in this block of code or somewhere else - can provide the main class code if needed.

Any help anyone can provided would be really appreciated as this has been bugging me for a while now.

Upvotes: 2

Views: 10476

Answers (1)

Frankie
Frankie

Reputation: 11918

From your code and the comments it sounds like your issue definitely lies with self.object

Your code never uses an if let statement to check to ensure self.object is not nil

Using println(username) works because your username is not nil. But when you try to call self.object.username, it's the self.object that is causing the crash.

You may have a property in your implementation like var object:CustomPFObject! which means, the first time you access this variable it's expected to not be nil. You'll probably want to check the code where you are setting self.object for the first time, and to make sure that it's being set before you've tried to access it.

If you're not able to manage when self.object is set, and when it's accessed, then change your declaration to var object:CustomPFObject? Now it's an optional, and as you write your code you'll be forced to make decisions as you go along.

For example:

var object:CustomPFObject?

let text = self.object.username //won't compile

let text = self.object!.username //mighty crash

let text = self.object?.username //you're safe, 'text' just ends up nil

I hope this helps you solve your issue.

Upvotes: 5

Related Questions