【问题标题】:iOS data filtering erroriOS数据过滤错误
【发布时间】:2015-11-16 16:49:45
【问题描述】:

我在下面有一些代码。我有一个来自 SwiftyJSON 的 JSON 对象,我想过滤它。 所以很自然地,我想:让我们过滤它并用过滤后的数据实例化一个新数组。

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'

我将如何解决这个问题?

【问题讨论】:

  • 什么是self.json?显示它的声明,以便我们知道它是什么类型。
  • 编辑问题以提供更多信息。
  • 找到原因了吗?我想知道它在哪里。

标签: ios json swift2.1


【解决方案1】:

你应该过滤一个数组。

使用以下内容:

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

如果上面的代码不起作用,那么检查JSON的类型。

【讨论】:

  • Cannot invoke 'filter' with an argument list of type '(@noescape (JSON) throws -> Bool)' 现在收到此错误..
  • @jbehrens94,我刚刚使用以下代码进行了快速测试:let json: JSON = ["a", "b", "c"] print(json.arrayValue.filter({ (letter: JSON) -> Bool in return letter.stringValue > "a" })) 它有效,所以我认为问题不在于语法。
  • 不过,这一点是正确的。 filter 适用于数组。 JSON 对象本身并不是一个数组——但它可能由一个数组支持。你需要那个数组。
  • 那么我该如何解决这个问题呢?我现在很迷茫如何解决我的错误。
  • 我没有在您的代码中看到arrayValue 方法。而最重要的部分是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2014-08-06
相关资源
最近更新 更多