2015-02-09 22 views
10

ho creato questa classe per il mio oggetto CittàiOS: creare una classe di oggetti con Swift

class City: NSObject { 

    var _name:String = "" 
    var name:String { 
     get { 
      return _name 
     } 
     set (newVal) { 
      _name = newVal 
     } 
    } 
} 

poi quando ho cassa il mio oggetto che faccio:

var city:City! 

city.name = "London" //crash here 

println("name city is\(city.name)"); 

crash quando ho impostato il nome con messaggio "errore fatale: trovato inaspettatamente nil mentre si scartava un valore Opzionale"

risposta

17

Questo non è in realtà una risposta (vedi altre risposte per una soluzione, come ad esempio @ Greg e @ zelib di), ma un tentativo di correggere alcuni errori che vedo nel codice

  1. Non c'è bisogno di creare calcolata + proprietà memorizzati (a meno che non si dispone di una ragione per questo):

    class City: NSObject { 
        var name: String = "" 
    } 
    
  2. Se si eredita dalla NSObject, si perde automaticamente tutte le funzioni rapide - evitarlo (a meno che non si dispone di una ragione per questo)

    class City { 
        var name: String = "" 
    } 
    
  3. Si utilizza una stringa vuota come mancanza di valore - rapida prevede optionals per quella

    class City { 
        var name: String? 
    } 
    
  4. alternativa a 3., una città senza nome non avrebbe molto senso, in modo da probabilmente vuole che ogni istanza abbia un nome. Utilizzare proprietà per non opzionale e un inizializzatore:

    class City { 
        var name: String 
        init(name: String) { 
         self.name = name 
        } 
    } 
    
  5. Evita optional implicitamente da scartare (se non avete una ragione per questo):

    var city: City 
    
+0

Questo non è in realtà una risposta! – D4ttatraya

5

Non hai inizializzato la variabile di città e quando provi ad usarlo si blocca.

inizializzarlo prima di utilizzarlo:

city = City() 
city.name = "London" 
2

Hai trovato errore perché non si inizializza la variabile città invece solo implicitamente scartarlo senza inizializzare in qualsiasi momento. Per inizializzarlo è necessario utilizzare il seguente codice

var city:City = City() 
1

È necessario chiamare il metodo init. Così si dovrebbe fare in questo modo:

var city:City=City() //Calls init and creates an instance 
city.name="foo" 

Se non si definisce un metodo init (è sempre una buona pratica che si fa), il metodo di default init viene chiamato.

0

Creare un oggetto con un valore

var cityName = City("cityName")// create a object with string value 
6

Proprio come qualsiasi altra programmazione orientata agli oggetti lingua e oggetto dovrebbero essere inizializzati prima di accedervi.
Come:

var city:City! 

Questo è solo riferimento dell'oggetto. Quindi, la memoria attuale non viene creata qui. È necessario creare un oggetto reale per City Class.

Fix aggiungendo seguente dichiarazione:

city = City()