我有一个名为Coupon的模型类,它有一个称为Array的对象数组! 当我从Coupon类创建一个对象时,该对象内部的数组为nil,并且出现错误。我在做什么错了?
class Coupon {
private var _date: String!
private var _editor: String!
private var _predictions: Array<Prediction>?
var date: String {
get {
return _date
}
}
var editor: String {
get {
return _editor
}
}
var predictions: Array<Prediction>? {
get {
return _predictions
}
set {
self._predictions = predictions
}
}
}
控制器如下:c.predictions![0]给出nil错误
let ref = DataService.ds.REF_COUPONS.queryOrdered(byChild: "date")
ref.observe(.childAdded, with: { (snapshot) in
if let couponDict = snapshot.value as? Dictionary<String, AnyObject> {
let c_key = snapshot.key
let c = Coupon(couponKey: c_key, couponData: couponDict)
let childSnapShot = snapshot.childSnapshot(forPath: "predictions")
if let snapshots = childSnapShot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshots{
let p_key = snap.key
let p = Prediction(predictionKey: p_key, predictionData: snap.value as! Dictionary<String, AnyObject>)
self.predictions.append(p)
c.predictions![0] = self.predictions[0] <--- ERROR LINE
}
}
self.coupons.append(c)
}
self.couponsTableView.reloadData()
})
答案 0 :(得分:1)
nil
。因此predictions!
将导致trying to unwrap an optional whose value is nil
类型的错误。您应该在此处创建新数组:
c.predictions = [self.predictions[0]]
也不需要快速备份字段。您的Coupon
类可以简化为:
class Coupon {
private(set) var date: String!
private(set) var editor: String!
var predictions: Array<Prediction>?
}
private(set)
意味着只能在此类内设置该值。
可以将预测var predictions: Array<Prediction>?
的定义行替换为默认值为空数组:
class Coupon {
private(set) var date: String!
private(set) var editor: String!
var predictions: [Prediction] = []
}
[Prediction]
与Array<Prediction>
一旦它具有默认值空数组而不是创建新数组,您就可以安全地附加到它:
c.predictions.append(self.predictions[0])
还要注意,即使在这种情况下,您的代码c.predictions[0] = self.predictions[0]
也将永远无法工作,因为默认情况下该数组没有第0
个元素。
答案 1 :(得分:0)
索引predictions
处0
数组中的元素不存在,因此不能用新元素替换它。我建议您将_predictions
数组替换为空的predictions
数组
var predictions = [Prediction]()
然后您可以将新元素添加到此数组中,如下所示:
c.predictions.append(self.predictions[0])
在您的情况下,也不需要将属性与getter和setter一起使用,并且您也可以使用struct
代替class
struct Coupon {
var date: String
var editor: String
var predictions = [Prediction]()
// your convenience init
}
答案 2 :(得分:0)
当您使用let c = Coupon(couponKey: c_key, couponData: couponDict)
创建类Coupon时,您的数组未初始化,因此在尝试在行c.predictions![0] = self.predictions[0] <--- ERROR LINE
中使用它时出现错误是正常的,您可以初始化对象Coupon像这样的空数组预测数组
class Coupon {
private var _date: String!
private var _editor: String!
private var _predictions = [Prediction]()