2015-11-16 2 views
1

У меня есть код ниже. У меня есть объект JSON от SwiftyJSON, и я бы хотел его отфильтровать. Так что, естественно, я подумал: давайте отфильтруем его и создадим новый массив с отфильтрованными данными.Ошибка фильтрации данных iOS

import UIKit 
import SwiftyJSON 
import Alamofire 

class SchoolSelectViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { 
    let url = "https://mijn.magister.net/api/schools?filter=%%%".stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) 
    var json: JSON = [] 
    var filteredJson: JSON = [] 
    var resultSearchController = UISearchController() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    Alamofire.request(.GET, self.url!).validate().responseJSON { 
     response in 
     switch response.result { 
     case .Success: 
     if let value = response.result.value { 
      self.json = JSON(value) 
     } 

     self.resultSearchController = UISearchController(searchResultsController: nil) 
     self.resultSearchController.searchResultsUpdater = self 
     self.resultSearchController.searchBar.delegate = self 
     self.resultSearchController.searchBar.sizeToFit() 

     self.tableView.tableHeaderView = self.resultSearchController.searchBar 
     self.definesPresentationContext = true 
     self.tableView.reloadData() 
     break 
     case .Failure: break 
     } 
    } 

    self.navigationController?.navigationBarHidden = true 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    print("Called tableView cellForRowAtIndexPath") 
    let cell = tableView.dequeueReusableCellWithIdentifier("schoolSelectCell")! as UITableViewCell 
    let cellTitle = json[indexPath.row]["Name"] 
    let cellDetailTitle = json[indexPath.row]["Url"] 

    cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator 
    cell.textLabel?.text = cellTitle.string 
    cell.detailTextLabel?.text = cellDetailTitle.string 

    return cell 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if (self.resultSearchController.active) { 
     return self.filteredJson.count 
    } else { 
     return self.json.count 
    } 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchString = self.resultSearchController.searchBar.text 
    } 

    func filterContentForTextSearch(searchText: String) { 
    self.filteredJson = self.json[0]["Name"].arrayValue.filter({ 
     (school: JSON) -> Bool in 
    }) 
    } 

} 

Но я заканчиваю цит получаю эту ошибку: Cannot convert value of type 'JSON -> Bool' to expected argument type '(Element) -> Bool'

Как бы решить эту проблему?

+0

Что такое 'self.json'? Покажите его объявление, чтобы мы знали, какой он тип. – matt

+0

Отредактированный вопрос, чтобы предоставить дополнительную информацию. – jbehrens94

+0

Вы нашли причину? Интересно, где это было. –

ответ

1

Вы должны фильтровать массив.

Используйте следующее:

self.filteredJson = self.json.arrayValue.filter({ 
    (school: JSON) -> Bool in 
     // Do something. 
}) 

Если код выше не работает, то проверьте тип JSON.

+0

'Невозможно вызывать 'фильтр' с помощью списка аргументов типа '(@noescape (JSON) throws -> Bool)'' Теперь эта ошибка. – jbehrens94

+0

@ jbehrens94, я только что проверил быструю проверку следующим кодом: '' 'let json: JSON = [" a "," b "," c "] print (json.arrayValue.filter ({(буква: JSON) -> Bool in return letter.stringValue>" a " })) '' ' И он работает, поэтому я не думаю, что проблема в синтаксисе. –

+0

Тем не менее, точка верна. 'filter' применяется к массиву. Объект 'JSON' сам по себе не является массивом, но он может поддерживаться массивом. Вам нужен этот массив. – matt