【问题标题】:Cannot convert ComparisonResult to closure result type Bool无法将 ComparisonResult 转换为闭包结果类型 Bool
【发布时间】:2018-07-19 12:31:40
【问题描述】:

这是我的代码:

var data = [list]()
var filtered = [list]()

struct list {
    var label1 : String = ""
    var label2 : String = ""
    var label3 : String = ""
}


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    filtered = data.filter { $0.label1.localizedCaseInsensitiveCompare(searchText) }
    if(filtered.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }


    self.tableView.reloadData()
}

我从 sql 查询结果添加到列表,它们看起来很好,但是当我尝试实现搜索功能时,我无法构建它并出现错误:

无法将“ComparisonResult”类型的值转换为闭包结果 输入“布尔”

【问题讨论】:

  • 你可以这样做 data.filter { $0.label1.localizedCaseInsensitiveCompare(searchText) == ComparisonResult.orderedAscending}

标签: ios swift


【解决方案1】:

注意,filter(_:) 接受闭包,应该返回 Bool 值:

func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]

据此,尝试查看localizedCaseInsensitiveCompare 的结果。它返回ComparisonResult,而不是Bool。因此,您应该将其与 ComparisonResult 类型(即 .orderedAscending..orderedSame.orderedDescending)进行比较。

例子:

let filtered = data.filter {
    $0.label1.localizedCaseInsensitiveCompare(searchText) == .orderedAscending 
}

更新。

localizedCaseInsensitiveCompare 真的是关于sorting。如果您想通过某些查询过滤数据并且大小写无关紧要,我建议您在data.label1searchText 上都使用.lowercased()

let filtered = data.filter {
    $0.label1.lowercased().contains(searchText.lowercased()) == .orderedAscending 
}

【讨论】:

  • 这次我可以毫无错误地构建,但搜索不会过滤,它总是未经过滤的数据
  • 我不得不删除 == .orderedAscending 但它确实有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多