2015-10-26 134 views
0

我有一个从网页中提取JSON数据的RestAPI,并且因为我想遵循MVC编程标准,我想通过实例化RestAPI的“数据列表”类获取此数据类。将类对象添加到数组[swift]

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

但是,我无法将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”类。然后我们将“卡”添加到“c”阵列。

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

问题:

运行代码后,“卡”阵列只返回名为“掌舵”虚设卡,并且没有添加到“c”的数组中的数据的。

注:

是的,我的API是工作,如果我在 “为VAR I = 0” 的循环,它打印正确的值打印值。如果我在同一个循环中打印“c.count”,我会得到两个(API只返回1个其他数据集或“卡”)。如果我在该循环外打印“c.count”,循环后,它表示当应该有两个(从JSON调用返回的哑元数据和数据)时,Array中只有1个项目。

所以,这显然是我的语法。或者我可能会让事情比他们需要的更复杂。我对Swift相当陌生,并且有些困惑。我只需要别人来看我的代码。

预先感谢您。

回答

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 } 
    } 
} 
+0

如果我移动的代码,它给我一个错误“需要明确的‘自我’,所以我把self.cards = c.sort {$ 0.cost <$ 1.cost}在该块。但现在它错误地说“变量'self.cards'在被初始化之前使用”想法? – wUmpage

+0

声明'cards'作为一个空数组:'var cards:[Card]()' – vadian

+0

应用程序表视图现在没有返回数据, array is empy:/ – wUmpage