Массив в объекте из модели данных равен нулю - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть класс модели с именем 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] выдает ноль ошибок

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

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Элемент в массиве predictions с индексом 0 не существует, поэтому вы не можете заменить его новым элементом.Я предлагаю вам заменить массив _predictions на пустой predictions массив

var predictions = [Prediction]()

, тогда вы можете добавить новый элемент в этот массив следующим образом:

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

Также в вашем случае естьнет необходимости использовать свойство с геттером и сеттером, и вы также можете использовать struct вместо class

struct Coupon {
    var date: String
    var editor: String
    var predictions = [Prediction]()

    // your convenience init
}
0 голосов
/ 14 декабря 2018

Когда вы создаете класс Coupon с let c = Coupon(couponKey: c_key, couponData: couponDict), ваш массив не инициализируется, так что это нормально, если вы пытаетесь использовать его в строке c.predictions![0] = self.predictions[0] <--- ERROR LINE, ваш объект Coupon вы можете инициализировать предсказания массива какпустой массив вроде этого

class Coupon {
private var _date: String!
private var _editor: String!
private var _predictions = [Prediction]()
0 голосов
/ 14 декабря 2018

Потому что по умолчанию это значение nil.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1008].Ваш класс 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 th элемент.

...