【问题标题】:Array in object from data model comes nil来自数据模型的对象中的数组为零
【发布时间】:2019-05-15 13:40:38
【问题描述】:

我有一个名为 Coupon 的模型类,它有一个名为 Array 的对象数组! 当我从 Coupon 类创建一个对象时,该对象内部的数组为零,并且出现错误。我做错了什么?

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()
    })

【问题讨论】:

    标签: ios swift object datamodel


    【解决方案1】:

    因为它的默认值是nil。所以predictions! 会导致trying to unwrap an optional whose value is nil 类型的错误。

    你应该在那里创建新数组:

    c.predictions = [self.predictions[0]]
    

    在 swift 中也不需要支持字段。您的 Coupon 类可以简化为:

    class Coupon {
        private(set) var date: String!
        private(set) var editor: String!
        var predictions: Array<Prediction>?
    }
    

    private(set)表示该值只能在该类内设置。

    预测var predictions: Array&lt;Prediction&gt;?的定义行可以替换为空数组的默认值:

    class Coupon {
        private(set) var date: String!
        private(set) var editor: String!
        var predictions: [Prediction] = []
    }
    

    [Prediction]Array&lt;Prediction&gt; 相同

    一旦它具有空数组的默认值而不是创建新数组,您就可以安全地附加到它:

    c.predictions.append(self.predictions[0])

    另请注意,即使在这种情况下,您的代码 c.predictions[0] = self.predictions[0] 也永远不会工作,因为数组默认为空,没有 0th 元素。

    【讨论】:

    • 谢谢你的解释很好))
    【解决方案2】:

    索引0 处的predictions 数组中的元素不存在,因此您不能用新元素替换它。我建议你用空的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
    }
    

    【讨论】:

      【解决方案3】:

      当您使用 let c = Coupon(couponKey: c_key, couponData: couponDict) 创建类 Coupon 时,您的数组未初始化,因此当您尝试在 c.predictions![0] = self.predictions[0] &lt;--- ERROR LINE 行中使用它时出现错误是正常的,您的对象 Coupon 您可以将数组预测初始化为像这样的空数组

      class Coupon {
      private var _date: String!
      private var _editor: String!
      private var _predictions = [Prediction]()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 2020-11-28
        • 2014-08-29
        相关资源
        最近更新 更多