2016-08-01 9 views
0

Я ищу, чтобы отсортировать ChangeArray так, чтобы он показывал запасы в порядке от наивысшего до самого низкого, я выполнил это с переменной sortChange, но BidArray и Массив хранилища не соответствует новым данным. Как я могу это исправить. Спасибо.Как я могу сортировать другие массивы, когда я успешно отсортировал один из трех

var StockArray = [String]() 
    var BidArray = [Double]() 
    var ChangeArray = [Double]() 




    @IBOutlet weak var tableView: UITableView! 


// @IBOutlet weak var StockSymbolLbl: UILabel! 
// @IBOutlet weak var BidSymbolLbl: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     getJSON() 
     automaticallyAdjustsScrollViewInsets = false 
     tableView.dataSource = self 
     tableView.delegate = self 
     tableView.registerNib(UINib(nibName: "StockHome", bundle: NSBundle.mainBundle()),forCellReuseIdentifier: "stockHome") 
     tableView.rowHeight = 60 
//  StockSymbolLbl.text = "" 
//  BidSymbolLbl.text = "" 


     } 



    func getJSON(){ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     let url = NSURL(string: self.stockURL) 
     let request = NSURLRequest(URL: url!) 
     let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
     let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 

      if error == nil { 

       let swiftyJSON = JSON(data: data!) 
       let Symbol: String? = swiftyJSON["query"]["results"]["quote"][0]["symbol"].stringValue 
       let bid: String? = swiftyJSON["query"]["results"]["quote"][0]["Bid"].stringValue 
       let change: String? = swiftyJSON["query"]["results"]["quote"][0]["Change"].stringValue 
       print(change!) 
       print(Symbol!) 
       print(bid!) 
       dispatch_async(dispatch_get_main_queue()) { 
//    self.StockSymbolLbl.text? = "\(Symbol!)" 
//    self.BidSymbolLbl.text? = "\(bid!)" 
        self.NumberofRows = swiftyJSON["query"]["results"]["quote"].count 

        for i in 0...self.NumberofRows { 
         var stockcount = 0 
         stockcount += i 
         let Stock = swiftyJSON["query"]["results"]["quote"][stockcount]["symbol"].stringValue 
         let Bid = swiftyJSON["query"]["results"]["quote"][stockcount]["Bid"].doubleValue 
         let Change = swiftyJSON["query"]["results"]["quote"][stockcount]["Change"].doubleValue 

         self.StockArray.append(Stock) 
         print(Stock) 
         self.BidArray.append(Bid) 
         print(Bid) 
         self.ChangeArray.append(Change) 
         print(Change) 
        } 
        self.tableView.reloadData() 
       } 



      }else{ 
       print("There was an error") 
      } 

     } 
     task.resume() 
    } 

} 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return NumberofRows 
    } 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell: StockHome = tableView.dequeueReusableCellWithIdentifier("stockHome", forIndexPath: indexPath) as! StockHome 

     if StockArray.count != 0{ 
      let sortChange = ChangeArray.sort(>) 
      cell.symbolLbl?.text = StockArray[indexPath.row] 
      let bid = BidArray[indexPath.item] 
      let changeRate = ChangeArray[indexPath.row] 
      cell.bidLbl?.text = "\(bid)" + " USD " 
      cell.changeLbl?.text = "\(changeRate)" + " %" 

     } 

     print(self.StockArray) 

     return cell 
    } 
    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
     switch ChangeArray[indexPath.row] { 
     case let x where x < 0.0: 
      cell.backgroundColor = UIColor(red: 255.0/255.0, green: 59.0/255.0, blue: 48.0/255.0, alpha: 1.0) 
     case let x where x > 0.0: 
      cell.backgroundColor = UIColor(red: 76.0/255.0, green: 217.0/255.0, blue: 100.0/255.0, alpha: 1.0) 
     case let x: 
      cell.backgroundColor = UIColor(red: 44.0/255.0, green: 186.0/255.0, blue: 231.0/255.0, alpha: 1.0) 
     } 
     cell.textLabel!.textColor = UIColor.whiteColor() 

     } 


} 

ответ

0

Прямо сейчас ваши три массива независимы и поэтому не гарантируют, что они будут в одном порядке.

Что бы я сделал, это сделать структуру с тремя значениями и добавить ее в один единственный массив, который вы можете сортировать.

struct Stock { 
    var symbol: String = "" 
    var bid: Double = 0.0 
    var change: Double = 0.0 
} 

Теперь вы можете переписать цикл в getJSON(), как это:

for i in 0..<self.NumberofRows { 
    let symbol = swiftyJSON["query"]["results"]["quote"][i]["symbol"].stringValue 
    let bid = swiftyJSON["query"]["results"]["quote"][i]["Bid"].doubleValue 
    let change = swiftyJSON["query"]["results"]["quote"][i]["Change"].doubleValue 
    let stock = Stock(symbol: symbol, bid: bid, change: change) 
    stockArray.append(stock) 
} 

Теперь вы должны иметь возможность сортировать 'StockArray' с этим:

stockArray = stockArray.sort({ 
    return $0.change > $1.change 
}) 

Слегка offtopic: некоторые подсказки

Попробуйте иметь первый символ имен переменных, не заглавных, первый символ Классы/Перечисления/Структуры капитализируются. Каждое новое слово внутри одного и того же имени переменной должно быть заглавным.

Во-вторых, попробуйте переписать цикл for для каждого цикла. some documentation. Это намного чище и делает ненужным NumberofRows. А так как все теперь в 1 массив можно использовать stockArray.count в numberOfRowsInSection

Вы можете сделать то прямо перед вызовом tableView.reloadData(), так это только отсортированный один раз, а не каждый раз, когда загружается клетка.

И наконец, попробуйте использовать if let при работе с JSON, который может измениться, таким образом, вы уверены, что вы относитесь к Double как на самом деле Double. Some documentation

+0

Когда я добавляю stockArray.append (Stock), я получаю сообщение об ошибке, потому что массив stockArray - это только строка, как я могу это исправить? – Patty

+1

изменить 'var StockArray = [String]()' to 'var StockArray = [Stock]()' – Houwert