2015-04-30 3 views
1

Я новичок в Swift и пытаюсь обернуть мою голову вокруг необязательных значений. Насколько я могу судить, хотя я, вероятно, ошибаюсь - переменные могут быть необязательными и, следовательно, содержать значение nil, и они должны учитываться в коде.Быстрые опции - Неожиданно найдено нуль при развертывании дополнительного значения

Всякий раз, когда я нажимаю кнопку «Сохранить» в своем приложении, я получаю сообщение об ошибке: «Неустранимая ошибка: неожиданно найдено нуль при развертывании необязательного значения».

@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) 

} 

Не уверен, что если ошибка из-за чего-то в этом блоке кода или где-то еще - может обеспечить основной код класса, если это необходимо.

Любая помощь, которую может предоставить любой, может быть оценена по достоинству, так как это уже давно подтачивало меня.

+0

Является ли 'self.date' а необязательным и происходит ошибка на строке' self.object.date = self.date'? Потому что похоже, что это единственное значение, которое может быть nil и не имеет 'if let'. – Moritz

+0

Кстати, вы должны делать все ваши 'if let', как вы делали в первом с' username': используйте развернутое значение внутри первой ветви. Я имею в виду использование 'amount' вместо' self.amountTextField.text' внутри 'if let' и т. Д. – Moritz

+0

Вы также можете получить' nil while unwrapping optional', если, например, ваш 'self.costTextField' не был подключен правильно как выход, и вы объявили его как неявно развернутый необязательный, как '@IBOutlet var costTextField: UITextField!' – Frankie

ответ

4

Из кода и комментариев это звучит как ваш вопрос, безусловно, лежит self.object

Ваш код никогда не использует в if let заявление, чтобы проверить, чтобы убедиться, self.object не ноль

Использование println(username) работает, потому что ваш username не ноль. Но когда вы пытаетесь позвонить self.object.username, это вызывает self.object, который вызывает крушение.

Возможно, у вас может быть свойство в вашей реализации, например var object:CustomPFObject!, что означает, что при первом доступе к этой переменной ожидается, что он не будет равен нулю. Вероятно, вы захотите проверить код, в котором вы впервые устанавливаете self.object, и убедиться, что он установлен до того, как вы попытаетесь получить к нему доступ.

Если вы не можете управлять, когда установлено self.object, а когда оно будет доступно, измените свое объявление на var object:CustomPFObject?. Теперь это необязательно, и, когда вы пишете свой код, вы будете вынуждены принимать решения по ходу дела вдоль.

Например:

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 

Я надеюсь, что это поможет вам решить вашу проблему.

+0

Спасибо, что решена проблема. Хотя теперь, когда я применяю переменную к 'object.username', она всегда равна нулю. Я предполагаю, что это связано с тем, как я настроил свой подкласс Parse, но документация, предоставленная Parse, в лучшем случае минимальна. – mforrest

+0

Я действительно не знаю, в чем проблема, но если 'object' имеет тип' PFObject', тогда попробуйте 'object [" username "]'. Предполагая, что ваш «объект», конечно, не ноль. – Frankie

+0

Согласно документации Parse, я могу установить переменную, используя 'object.username = x'. Он отлично работает при получении переменных из объекта с помощью 'x = object.username', но да, возможно, объект равен нулю, я посмотрю на это. – mforrest

Смежные вопросы

 Смежные вопросы