J'ai créé cette classe pour mon objet Ville
class City: NSObject {
var _name:String = ""
var name:String {
get {
return _name
}
set (newVal) {
_name = newVal
}
}
}
alors quand je crée mon objet je fais:
var city:City!
city.name = "London" //crash here
println("name city is\(city.name)");
il se bloque lorsque je mets le nom avec le message "erreur fatale: inopinément trouvé nil lors du décompression d'une valeur facultative"
Ce n'est pas réellement une réponse (voir les autres réponses pour une solution, telle que @ Greg et @ zelib), mais une tentative pour réparer certaines erreurs que je vois dans votre code
Pas besoin de créer la propriété calculée + stockée (sauf si vous avez une raison pour cela):
class City: NSObject {
var name: String = ""
}
Si vous héritez de NSObject
, vous perdez automatiquement toutes les fonctionnalités de Swift - évitez-le (à moins que vous n'ayez une raison à cela)
class City {
var name: String = ""
}
Vous utilisez une chaîne vide comme absence de valeur - Swift fournit les options optionnelles pour cela
class City {
var name: String?
}
Alternative à 3., une ville sans nom n'aurait pas beaucoup de sens, alors vous voulez probablement que chaque instance ait un nom. Utilisez une propriété non optionnelle et un initialiseur:
class City {
var name: String
init(name: String) {
self.name = name
}
}
Évitez les options implicitement non emballées (sauf si vous avez une raison à cela):
var city: City
Comme tout autre langage de programmation orienté objet, l'objet doit être initialisé avant d'y accéder.
Comme:
var city:City!
Ceci est juste la référence de l'objet. Donc, la mémoire réelle n'est pas créée ici. Vous devez créer un objet réel pour City Class.
Corrigez-le en ajoutant l'instruction suivante:
city = City()
Vous n'avez pas initialisé la variable city et lorsque vous essayez de l'utiliser, elle plante.
initialisez-le d'abord avant de l'utiliser:
city = City()
city.name = "London"
Vous obtenez une erreur parce que vous n'initialisez pas votre variable city. Vous la décompressez implicitement sans l'initialiser à aucun moment. Pour l'initialiser, vous devez utiliser le code suivant
var city:City = City()
Vous devez appeler la méthode init. Donc, vous le feriez comme ceci:
var city:City=City() //Calls init and creates an instance
city.name="foo"
Si vous ne définissez pas de méthode init (c'est toujours une bonne pratique), la méthode init par défaut est appelée.