【问题标题】:Appending Class Objects to Array [Swift]将类对象附加到数组 [Swift]
【发布时间】:2015-10-26 15:58:51
【问题描述】:

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

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

但是,我无法将 Card Class 数据附加到 CardList Array。

这是 CardList 类的代码:

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
}

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

然后我们循环遍历“items”数组,将其读取为 JSON(我使用的是 SwiftyJSON 插件/代码片段)并为数组中的每个项目创建一个新的“Card”类。然后我们将“Card”附加到“c”数组中。

最后我们将卡片数组“cards”设置为等于按其价值成本排序的“c”数组。

问题:

运行代码后,“cards”数组只返回名为“helm”的虚拟卡片,没有任何数据添加到“c”数组中。

注意事项:

是的,我的 Api 正在工作,如果我在“for var i = 0”循环中打印值,它会打印正确的值。如果我在同一个循环中打印“c.count”,我会得到两个(API 只返回 1 个其他数据集或“卡”)。如果我在该循环之外打印“c.count”,则在循环之后,它表示数组中只有 1 个项目,而应该有两个项目(虚拟数据和从 JSON 调用返回的数据)。

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

提前谢谢你。

【问题讨论】:

    标签: arrays json xcode swift api


    【解决方案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 }
        }
    }
    

    【讨论】:

    • 如果我移动代码,它会给我一个错误“需要明确的'self。',所以我把 self.cards = c.sort { $0.cost
    • 声明cards为空数组:var cards: [Card]()
    • 应用表视图现在没有返回数据,数组是空的:/
    • 我正在使用var cards: [Card] = [],但即使是你的,在初始化时它仍然是空的。我在self.cards = c.sort { $0.cost &lt; $1.cost } 之后添加了print(self.cards.count),它返回值为2.. 但没有显示任何数据,真的很茫然
    • 也许我需要以某种方式重新加载表数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多