在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数组