2015-02-09 1 views
10

Я создал этот класс для моего объекта ГородIOS: создать класс объектов с Swift

class City: NSObject { 

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

тогда, когда я клеть моего объекта я:

var city:City! 

city.name = "London" //crash here 

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

его падение, когда я установил имя с сообщение «фатальная ошибка: неожиданно обнаружена нуль при развертывании необязательного значения»

ответ

17

Это на самом деле не ответ (см другие ответы на решения, такие как @ Грег и @ zelib), но попытка исправить некоторые ошибки, которые я вижу в вашем коде

  1. Нет необходимости создавать вычислен + хранится имущество (если у вас есть причины для этого):

    class City: NSObject { 
        var name: String = "" 
    } 
    
  2. Если вы унаследовали от NSObject, вы автоматически теряете все оперативные функции - избежать этого (если у вас есть причины для этого)

    class City { 
        var name: String = "" 
    } 
    
  3. Вы используете пустую строку как отсутствие значения - быстры обеспечивает optionals для этого

    class City { 
        var name: String? 
    } 
    
  4. Альтернатива 3., город без названия не имеет особого смысла, так что вы вероятно, хотите, чтобы каждый экземпляр имел имя. Не использовать дополнительное свойство и инициализатор:

    class City { 
        var name: String 
        init(name: String) { 
         self.name = name 
        } 
    } 
    
  5. Избегай неявный распакованное УСТРОЙСТВО (если у вас есть причины для этого):

    var city: City 
    
+0

Это на самом деле не ответ! – D4ttatraya

5

Вы не инициализировали переменную города, а когда пытаетесь ее использовать, она падает.

инициализирует его первым, прежде чем использовать его:

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

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

var city:City = City() 
1

Вы должны вызвать метод init. Таким образом, вы могли бы сделать это следующим образом:

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

Если не определить метод инициализации (это всегда хорошая практика, что вы делаете), метод инициализации по умолчанию называется.

0

Создать объект со значением

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

Как и любое другое объектно-ориентированное программирование язык и объект должны быть инициализированы перед доступом к нему.
Как:

var city:City! 

Это просто ссылка на объект. Таким образом, фактическая память не создается здесь. Вам необходимо создать фактический объект для City Class.

Фикс, добавив следующее заявление:

city = City()