在swift中过滤数组

时间:2015-08-05 06:21:48

标签: ios arrays swift filtering

如何通过一个或多个标志过滤自定义对象数组?

let flags = ["New product", "Season 2014", "Season 2015", "Product available"]

使用一个或多个标志或更多静态标志很容易:

let filteredArray = myCustomObjectsArray.filter() { $0.isNew == true }

let filteredArray = myCustomObjectsArray.filter() { $0.isNew == true && $0.season.rangeOfString("14") && $0.season.rangeOfString("15") && $0.isAvailable }

但是如果标志是动态的,那么标志数组是由用户点击tableview的单元格创建的?

其他问题是在`filter(){condition1&& amp;}中尝试连接多个条件时出错。 condition2等}。 "表达是复杂的,需要在合理的时间内解决......"。

因此,flags数组是用户选择的(只是tableview单元格中的标题)。如果flags数组是["新产品","第2015季"],我想过滤.isNew和.season.rangeOfString(" 15"),例如。所以我按属性排序,而不是按字符串排序。

3 个答案:

答案 0 :(得分:4)

您尚未发布所有必需的代码,.isNew.season来自哪里?它似乎是自定义对象。

您所引用的错误("表达式太复杂,无法在合理的时间内解决")已经有了答案:

  

If condition failing with expression too complex

话虽如此,你应该能够通过将表达式的每个部分分离成单独的语句来解决这个问题:

let filteredArray = myCustomObjectsArray.filter() {
    let isNew = $0.isNew == true
    let is14 = $0.season.rangeOfString("14")
    let is15 = $0.season.rangeOfString("15")
    let isAvailable = $0.isAvailable
    return isNew && is14 && is15 && isAvailable
}

答案 1 :(得分:0)

对于多个条件,请尝试以下代码。它可能对你有帮助。

let tryAnchoredFirst = array1.filter { (text) -> Bool in
            let tmp: NSString = text

            var range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch )
            return range.location != NSNotFound
        }
        // If the result of the filter is zero for first case then it will go to else part
        if tryAnchoredFirst.count > 0 {
            self.filteredTableData = tryAnchoredFirst
        }
        else {

            // Check second array
            self.filteredTableData = array2.filter { (text) -> Bool in

                let tmp: NSString = text
                var range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            }
        }

答案 2 :(得分:0)

您的数组是:

var flags = ["New product", "Season 2014", "Season 2015", "Product available"]

首先,您声明filteredArray

var filteredArray : [String] = [String]()

使一个方法rangeString检查字符串是否可用。

func rangeString(x : String) -> [String]
    {
        if x.rangeOfString("Season") != nil {

            filteredArray += [x]
        }
        return filteredArray
    }

现在调用以下功能

flags.map({x in self.rangeString(x)})

打印yout filteredArray并获得结果。

 println(filteredArray)

enter image description here

注意:对数组中的两个字符串检查应用相同的想法。

Filter array