简体   繁体   中英

object list always print nil in swift

In my object Dish xxx.Dish , I want to access the Choice class price and name to display but I failed. dish data load from web API and I tested data loaded success full and put the data to the object dish and it return the object list to viewcontroller to load tableview.

Output of printed console

Optional([xxx.Dish, xxx.Dish])

and in the dish class before append optionList?.append(_obj)

xxx.DishOption

Anyone helps me how can I do that .. I am new to swift and is it right way to implement? Please suggest me?

class Dish {
        let dishId : String
        var optionList : [DishOption]?

        init?(fromAPIResponse resposne : Dictionary<String,AnyObject>) {

            guard let dishId = resposne["dishId"] as? String else {
                return nil

            }
            self.dishId = dishId
            if let objs =  resposne["options"] as?  [[String: AnyObject]]{

                for obj in objs {
                    if  let _obj = DishOption(fromAPIResponse: obj){

                        optionList?.append(_obj)

                    }
                }
            }
        }

        class DishOption {

            let optionId : String

            var choiceList : [Choice]?

            init?(fromAPIResponse resposne : Dictionary<String,AnyObject>) {

                guard let  optionId = resposne["optionId"] as? String else {
                    return nil
                }

                self.optionId = optionId

                if let objs =  resposne["choices"] as?  [[String: AnyObject]]{

                    for obj in objs {
                        if  let _obj = Choice(fromAPIResponse: obj){

                            choiceList?.append(_obj)

                        }
                    }
                }
            }
        }

        class Choice{

            let choiceId : String
            let name : String
            let price : String

            init?(fromAPIResponse resposne : Dictionary<String,AnyObject>) {
                guard let choiceId = resposne["choiceId"] as? String ,
                    let name = resposne["name"]  as? String,
                    let price = resposne["price"] as? String else {

                        return nil
                }
                self.choiceId = choiceId
                self.name = name
                self.price = price

            }

    }

UPDATE:

     var  dishMenuList = [Dish]()
            guard let objs = json["menu_list"] as? [[String : AnyObject]] else {
                return
            }

            for obj in objs {

                if let _obj = Dish(fromAPIResponse: obj){

                 print(_obj.optionList) //always print nil  


                if let options = _obj.optionList {

                    for data in options {

                        print(data.displayAsButton)

                    }
                   }
                   dishMenuList.append(_obj)
                }

            }

From what I can see, you are never initializing both the optionList and choiceList arrays. It would be better to initialize them as empty arrays:

class Dish {
        let dishId : String
        var optionList = [DishOption]()
...

       optionList.append(_obj)

This is the reason that you cannot see any options. Since the optionList is still nil, the line optionList?.append(_obj) does not execute.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM