我有一个课,我填写了一些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;
}
}
字段supplierId
和supplierName
可能是空的(并非总是如此。当我运行我的应用程序并尝试从其中一个空属性中获取值时,我得到错误。
我尝试删除了!被迫从我的吸气器中解开,但它不会编译并抱怨它。
我有一个带有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值时仍然会抛出错误。
为什么我不能满足这些选项?
答案 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
时。