2016-01-12 1 views
0

У меня есть класс, который я сделал, чтобы заполнить некоторые данные 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 коалесцирующего оператора на свойствах, которые могут быть нулевыми, но он по-прежнему бросает ошибку при попытке передать любые значения, которые являются нулем.

Почему я не могу насытить эти опции?

+2

Либо измените 'supplierName' поглотитель для возврата' строку? ', Так что вы не должны заставить разворачивать его или оставить его как' String' и изменить его на 'вернуть _supplierName ?? "" '. – dan

+2

Также кажется, что я думаю, что вы пытаетесь сделать с публичным getter для частной собственности, было бы намного проще, если бы вы объявили их как private (set) public var supplierName: String? ', Который позволит вам установить их внутри класс, но получить только извне – dan

+0

Для базовых типов 'Int' и' String' считать использование необязательного '0' и' '' 'как' nil'. Это позволяет избежать накладных расходов для обработки опций. – vadian

ответ

1

Если ваш проект может работать с пустой строкой для «no String value» и 0 для «no Int value», это гораздо более простой синтаксис (упрощен с 3 свойствами). Из-за декларации как константы все свойства рассматриваются как доступные только для чтения без частной резервной переменной.

class Inventory { 

    let id, supplierId: Int 
    let supplierName: String 

    init(id: Int, supplierId: Int?, supplierName: String?) { 
    self.id = id 
    self.supplierId = supplierId ?? 0 
    self.supplierName = supplierName ?? "" 
    } 
} 

Вместо if supplierName == nil вы можете проверить if supplierName.isEmpty

0

Попробуйте

var supplierId: Int? { 
    return _supplierId; 
} 

var supplierName: String? { 
    return _supplierName; //return optional value 
} 

Не силой разворачивать свои Иварс при получении его стоимости, а проверить это при использовании его значение.

Для информации:

, когда у вас есть только get блок непосредственно возвращают значение вместо написания get block.

https://github.com/github/swift-style-guide