У меня есть класс, который я сделал, чтобы заполнить некоторые данные JSON. Пара свойств в классе MIGHT может быть нулевым в некоторых случаях. Я думал, что готов к этому, но когда я пытаюсь получить доступ к классу, и один из свойств null, я получаю сообщение об ошибке unexpectedly found nil while unwrapping an Optional value
. Эта ошибка появляется только в том случае, если значение одного из свойств равно null. Вот мой класс:Пользовательские объекты класса могут иметь значение NULL. Как я могу сказать об этом свой инициализатор?
class Inventory {
private var _id, _quantityOnHand: Int!;
private var _item, _description: String!;
private var _supplierId: Int?;
private var _supplierName: String?;
var id: Int {
get {
return _id;
}
}
var item: String {
get {
return _item;
}
}
// ... removed for brevity
var supplierId: Int {
get {
return _supplierId!;
}
}
var supplierName: String {
get {
return _supplierName!; //this is where error is when value is null
}
}
init(id: Int, item: String, description: String, quantityOnHand: Int, supplierId: Int?, supplierName: String?) {
_id = id;
_item = item;
_description = description;
_quantityOnHand = quantityOnHand;
_supplierId = supplierId;
_supplierName = supplierName;
}
}
Поле supplierId
и supplierName
МОГ возможно быть пустым (не всегда, хотя, когда я бег моего приложения и пытается получить значение одного из нулевых свойств я получаю ошибку
Я попытался удалением! вынуждены развернутым из моего добытчика, но он не будет компилировать и жалуюсь на это.
у меня есть UITableView
с Segue посылами информации к следующему контроллеру представления. В нем я помещаю все значения резьбовой строки UITableView
в переменные. Вот сегмент уй:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "segueToItemDetail" {
if let destination = segue.destinationViewController as? InventoryItemViewController {
if let itemIndex = inventoryListTableView.indexPathForSelectedRow?.row {
destination.idInt = warehouseItems[itemIndex].id;
destination.itemString = warehouseItems[itemIndex].item;
destination.descriptionString
= warehouseItems[itemIndex].description;
destination.supplierNameString = warehouseItems[itemIndex].supplierName ?? "";
destination.quantityOnHandInt = warehouseItems[itemIndex].quantityOnHand;
}
}
}
Я попытался с помощью Nil коалесцирующего оператора на свойствах, которые могут быть нулевыми, но он по-прежнему бросает ошибку при попытке передать любые значения, которые являются нулем.
Почему я не могу насытить эти опции?
Либо измените 'supplierName' поглотитель для возврата' строку? ', Так что вы не должны заставить разворачивать его или оставить его как' String' и изменить его на 'вернуть _supplierName ?? "" '. – dan
Также кажется, что я думаю, что вы пытаетесь сделать с публичным getter для частной собственности, было бы намного проще, если бы вы объявили их как private (set) public var supplierName: String? ', Который позволит вам установить их внутри класс, но получить только извне – dan
Для базовых типов 'Int' и' String' считать использование необязательного '0' и' '' 'как' nil'. Это позволяет избежать накладных расходов для обработки опций. – vadian