Swift Options - de façon Inattendue trouvé nulle lors de déballage d'une valeur facultative
Je suis nouveau sur Swift et ont été d'essayer d'envelopper (ha) ma tête autour de valeurs optionnelles. Aussi loin que je peux voir - même si je suis probablement mal - variables peuvent être en option et, par conséquent, contenir une valeur nulle, et ceux-ci doivent être comptabilisées dans le code.
Chaque fois que j'ai touché le bouton "enregistrer" dans mon application, j'obtiens l'erreur: "fatal error: de façon inattendue trouvé nulle, tandis que d'ôter une Option de valeur".
@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)
}
Ne sais pas si l'erreur est à cause de quelque chose dans ce bloc de code ou quelque part d'autre - peut fournir à la classe principale de code si nécessaire.
Aucune aide n'importe qui peut à condition serait vraiment apprécié comme cela a été m'énerve pour un certain temps maintenant.
- Est
self.date
Facultative et l'erreur qui se passe sur leself.object.date = self.date
ligne? Parce qu'on dirait que c'est la seule valeur qui pourrait être nul et n'ont pas deif let
. - BTW, vous devriez le faire avec tous vos
if let
comme vous l'avez fait dans la première, avecusername
: utilisation de l'déballé valeur à l'intérieur de la première branche. Je veux dire, utiliseramount
au lieu deself.amountTextField.text
à l'intérieur de laif let
, etc. - Vous pouvez également obtenir
nil while unwrapping optional
si par exemple, votreself.costTextField
n'a pas été raccordé correctement à une prise de courant et vous avait déclaré comme implicitement déballé optionnel comme@IBOutlet var costTextField: UITextField!
- J'ai supprimé toutes les références à ce Jour juste pour s'assurer que l'erreur s'affiche toujours. Également changé mon
if let
déclarations comme vous l'avez suggéré et ça ne fonctionne toujours pas. Pourrait-il peut-être d'autres code de l'origine de l'erreur? Même si cette erreur se produit uniquement lorsque j'exécute l'saveTapped
action. - mon textFields sont déclarées comme implicitement déballé...comment doivent-elles être déclarées?
- Xcode doit mettre en évidence la ligne où l'erreur se produit, normalement. N'est ce pas?
- l'erreur s'affiche dans la console et Xcode me montre un complexe à la recherche de la page avec des trucs comme ça partout:
0x100435474 <+44>: brk #0x1
. Ne semble pas montrer d'où l'erreur se trouve dans mon code. - Je vois. Dans ce cas, je voudrais essayer de définir des points d'arrêt dans votre code à des lieux importants de try et catch où il se bloque exactement. Pas sûr du tout qu'elle vient du code de vous montrer ici. :/
Vous devez vous connecter pour publier un commentaire.
À partir de votre code et les commentaires, il semble que votre problème se trouve avec
self.object
Votre code n'utilise jamais un
if let
instruction pour vérifier pour s'assurer de l'auto.l'objet n'est pas nul,À l'aide de
println(username)
fonctionne parce que votreusername
n'est pas nul. Mais lorsque vous essayez d'appelerself.object.username
, c'est laself.object
qui est à l'origine du crash.Vous pouvez avoir une propriété de la mise en œuvre comme
var object:CustomPFObject!
qui signifie que, la première fois que vous accédez à cette variable devrait pas être nul. Vous aurez probablement envie de vérifier le code où vous êtes réglage auto.objet pour la première fois, et assurez-vous qu'il soit mis devant vous ai essayé d'y accéder.Si vous n'êtes pas en mesure de gérer quand
self.object
est défini, et quand il est accessible, puis modifier votre déclaration devar object:CustomPFObject?
Maintenant, c'est une option, et comme vous l'écrivez votre code, vous serez peut-être obligé de prendre des décisions comme vous allez le long.Par exemple:
J'espère que cela vous aide à résoudre votre problème.
object.username
il est toujours nul. Je suppose que c'est quelque chose à voir avec la façon dont j'ai mis en place ma Analyser sous-classe, mais la documentation fournie par Analyser est minimum, au mieux.object
est de typePFObject
puis essayezobject["username"]
. En supposant que votreobject
n'est pas nul, bien sûr.object.username = x
. Il fonctionne très bien lors de l'obtention des variables de l'objet à l'aidex = object.username
mais oui, peut-être que l'objet est nul, je vais regarder ça.