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