来自数据模型的对象中的数组为零
Array in object from data model comes nil
我有一个名为 Coupon 的模型 class,它有一个名为 Array 的对象数组!
当我从 Coupon class 创建一个对象时,该对象内部的数组变为 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] 给出零错误
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()
})
因为它的值默认是nil
。所以 predictions!
会导致 trying to unwrap an optional whose value is nil
种错误。
你应该在那里创建新数组:
c.predictions = [self.predictions[0]]
swift 中也不需要支持字段。您的 Coupon
class 可以减少为:
class Coupon {
private(set) var date: String!
private(set) var editor: String!
var predictions: Array<Prediction>?
}
private(set)
表示只能在这个class内设置值。
预测的定义行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
个元素。
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
}
当您使用 let c = Coupon(couponKey: c_key, couponData: couponDict)
创建 class 优惠券时,您的数组未初始化,因此当您尝试在行 c.predictions![0] = self.predictions[0] <--- ERROR LINE
中使用它时出现错误是正常的,你的对象优惠券你可以像这样将数组预测初始化为一个空数组
class Coupon {
private var _date: String!
private var _editor: String!
private var _predictions = [Prediction]()
我有一个名为 Coupon 的模型 class,它有一个名为 Array 的对象数组! 当我从 Coupon class 创建一个对象时,该对象内部的数组变为 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] 给出零错误
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()
})
因为它的值默认是nil
。所以 predictions!
会导致 trying to unwrap an optional whose value is nil
种错误。
你应该在那里创建新数组:
c.predictions = [self.predictions[0]]
swift 中也不需要支持字段。您的 Coupon
class 可以减少为:
class Coupon {
private(set) var date: String!
private(set) var editor: String!
var predictions: Array<Prediction>?
}
private(set)
表示只能在这个class内设置值。
预测的定义行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
个元素。
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
}
当您使用 let c = Coupon(couponKey: c_key, couponData: couponDict)
创建 class 优惠券时,您的数组未初始化,因此当您尝试在行 c.predictions![0] = self.predictions[0] <--- ERROR LINE
中使用它时出现错误是正常的,你的对象优惠券你可以像这样将数组预测初始化为一个空数组
class Coupon {
private var _date: String!
private var _editor: String!
private var _predictions = [Prediction]()