在swift中过滤数组

我怎样才能通过一个或多个标志过滤自定义对象的数组?

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 } 

但是,如果标志是dynamic的,即标志数组是由用户点击tableview的单元格创build的呢?

其他问题是在尝试连接`filter(){condition1 && condition2等}中的多个条件时出错。 “expression复杂,要在合理的时间内解决……”。

所以,flags数组是用户select的(只是来自tableview单元格的标题)。 如果flags数组是[“New product”,“Season 2015”],我想用.isNew和.season.rangeOfString(“15”)来过滤。 所以我按属性sorting,而不是string。

你还没有发布所有必要的代码, .isNew.season来自哪里? 这似乎是自定义对象。

你提到的错误(“expression太复杂,无法在合理的时间内解决”)已经有了一个答案:

如果条件失败,expression式太复杂

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

 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 } 

对于多个条件请尝试下面的代码。 这可能对你有所帮助。

 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 } } 

你的数组是:

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

首先声明filteredArray

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

使一个方法rangeString检查string是否可用。

 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) 

在这里输入图像说明

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

filter数组