自定义类对象可能为null。我怎么能告诉我的初始化器呢?

时间:2016-01-12 18:54:24

标签: ios swift2

我有一个课,我填写了一些JSON数据。在某些情况下,类中的一些属性可能为null。我以为我为此做好了准备,但是当我尝试访问该类并且其中一个属性为null时,我收到错误unexpectedly found nil while unwrapping an Optional value。仅当其中一个属性的值为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;

    }
}

字段supplierIdsupplierName可能是空的(并非总是如此。当我运行我的应用程序并尝试从其中一个空属性中获取值时,我得到错误。

我尝试删除了!被迫从我的吸气器中解开,但它不会编译并抱怨它。

我有一个带有segue的UITableView,它将信息发送给下一个视图控制器。在其中我将UITableView的抽头行的所有值都放入变量中。这是segue:

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;

                }
            }
        }

我尝试在可能为null的属性上使用Nil Coalescing Operator但是在尝试传递任何null值时仍然会抛出错误。

为什么我不能满足这些选项?

2 个答案:

答案 0 :(得分:1)

如果您的设计可以使用空字符串表示“无字符串值”而0表示“无内部值”,则这是一种更简单的语法(简化为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

答案 1 :(得分:0)

试试这个

var supplierId: Int? {
     return _supplierId;
}

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

在获取其价值时不要强行打开你的iVars,而是在使用它的价值时检查它。

有关您的信息:

当您只有get阻止直接返回值而不是写get block时。

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