IOS: создать класс объектов со Swift

Я создал этот класс для моего объекта City

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)");

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

Ответ 1

На самом деле это не ответ (см. другие ответы для решения, такие как @Greg и @zelib's), но попытка исправить некоторые ошибки, которые я вижу в вашем коде

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

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

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

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

    class City {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
  • Избегайте неявно развернутых опций (если у вас нет причин для этого):

    var city: City
    

Ответ 2

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

var city:City!

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

Исправить, добавив следующую инструкцию:

city = City()

Ответ 3

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

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

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

Ответ 4

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

var city:City = City()

Ответ 5

Вы должны вызвать метод init. Итак, вы сделали бы это так:

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

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

Ответ 6

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

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