web-dev-qa-db-fra.com

iOS: créer une classe d'objet avec Swift

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"

16
CrazyDev

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

  1. 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 = ""
    }
    
  2. 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 = ""
    }
    
  3. Vous utilisez une chaîne vide comme absence de valeur - Swift fournit les options optionnelles pour cela

    class City {
        var name: String?
    }
    
  4. 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
        }
    }
    
  5. Évitez les options implicitement non emballées (sauf si vous avez une raison à cela):

    var city: City
    
26
Antonio

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()
9
Srinath Mithra

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"
6
Greg

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()
3
Zell B.

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.

1
Dhruv Ramani