将类对象附加到数组[Swift]

时间:2015-10-26 15:58:52

标签: arrays json xcode swift api

我有一个从网页上提取JSON数据的RestAPI,因为我想遵循MVC编程标准,我想通过"数据列表"来获取这些数据。实例化RestAPI类的类。

我有一个名为" Card"的类,它提供了一种数据对象的基本结构。我有一个名为" CardList"其初始化创建了一个" Card"类。

但是,我在将卡类数据附加到我的CardList数组时遇到了问题。

以下是CardList Class的代码:

class CardList {

    var cards: [Card]

    static var sharedInstance = CardList()

    //MARK - Initalize
    private init(){

        //Dummy Data
        let helm = Card(name: "Helm of Testing", cost: 10, type: "Equipment", subType: "Head Armor", description: "Some say the Helmet of Testing helps keep it's wearers mind clear.")

        //Add to Array
        var c = [helm]
        let items: NSMutableArray = []

        //Get API Array
        RestApiManager.sharedInstance.getElements { (json: JSON) in
            let results = json["results"]
            for (_, subJson) in results {
                let card:AnyObject = subJson["card"].object
                items.addObject(card)
            }

            for var i = 0; i < items.count; ++i{
                let data:JSON = JSON(items[i])
                let newCard = Card(name: data["title"].stringValue, cost: Int(data["cost"].string!)!, type: data["type_id"].stringValue, subType: data["subtype_id"].stringValue, description: data["description"].stringValue)

                c.append(newCard)
            }

        }
        cards = c.sort { $0.cost < $1.cost }
    }

    //END Class
}

所以基本上在初始化时,这个类创建一个虚拟卡,将其添加到名为&#34; c&#34;的数组中。一个名为&#34; items&#34;的数组被建造。 RestApiManager返回JSON数据,对于结果中返回的每种类型的数据,它都会被添加到&#34; items&#34;阵列。

然后我们遍历&#34;项目&#34;数组,将其读作JSON(我使用SwiftyJSON插件/代码片段)并创建一个新的&#34; Card&#34;数组中每个项的类。然后我们追加&#34;卡&#34;到&#34; c&#34;阵列。

最后我们采用卡阵列&#34;卡&#34;并将其设置为等于&#34; c&#34;数组按其价值成本排序。

问题:

运行代码后,&#34;卡&#34; Array仅返回名为&#34; helm&#34;的虚拟卡,并且没有任何数据添加到&#34; c&#34;阵列。

注意:

是的,如果我在&#34;中打印值,我的Api正在工作,因为var i = 0&#34;循环,它打印正确的值。如果我打印&#34; c.count&#34;在同一个循环中,我得到两个(API只返回1个其他数据集,或者&#34; Card&#34;)。如果我打印&#34; c.count&#34;在循环之后,在循环之后,它表示当应该有两个时,数组中只有一个项目(虚拟数据和从JSON调用返回的数据)。

所以,这显然与我的语法有关。或者也许我让事情变得比他们需要的更复杂。我对Swift很新,有些困惑。我只需要别人来查看我的代码。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

RestApiManager.sharedInstance.getElements异步工作 包含数据的块在init函数退出后执行。

移动代码以将数组分配并排序到块中。

...
        for var i = 0; i < items.count; ++i{
            let data:JSON = JSON(items[i])
            let newCard = Card(name: data["title"].stringValue, cost: Int(data["cost"].string!)!, type: data["type_id"].stringValue, subType: data["subtype_id"].stringValue, description: data["description"].stringValue)

            c.append(newCard)
        }
        cards = c.sort { $0.cost < $1.cost }
    }
}