如果过滤器返回nil,我怎么不返回空结果?

时间:2016-04-30 13:21:34

标签: ios swift

我正在执行以下过滤,返回配方列表,按给定的类别名称值进行过滤。

filteredRecipe = filteredRecipe.filter({
    if let category = $0.valueForKey("category") as? NSManagedObject {
        if let name = category.valueForKey("name") as? String {
            return name.rangeOfString(cap) != nil
        } else {
            return false
        }
    } else {
        return false
    }
})

此过滤器与searchBar文本字段相关联,因此我可能在文本字段中具有随机值,这将使filteredRecipe保存不可靠的数据。

我需要确保当过滤器找不到具有给定类别名称值的filteredRecipe的任何食谱时,我保持filteredRecipe不变。 目前,当没有匹配时,它会使filteredRecipe为空数组[]。我不确定是什么原因造成的。

2 个答案:

答案 0 :(得分:4)

您需要将过滤结果分配给临时变量并检查它是否为空。

let filtered = filteredRecipe.filter({
    if let category = $0.valueForKey("category") as? NSManagedObject {
        if let name = category.valueForKey("name") as? String {
            return name.rangeOfString(cap) != nil
    } 
    return false
})

if !filtered.isEmpty {
    filteredRecipe = filtered
}

答案 1 :(得分:0)

另一种方法是使用Collection属性扩展selfOrNilIfEmpty,并使用nil合并运算符:

extension Collection {
    var selfOrNilIfEmpty: Self {
        return isEmpty ? nil : self
    }
}

,以及更高版本,在您的代码上:

let filteredRecipe = filteredRecipe.filter { ... }.selfOrNilIfEmpty ?? filteredRecipe