正如其他答案指出的那样,您正在搜索具有值“al”的项目的结果数组。什么你想实际上是返回结果的数组,缩小到只有那些匹配:
struct SearchResult {
let type:String
let typeTitle:String
let results:[String]
}
let searchResultItem1 = SearchResult(
type: "contact",
typeTitle: "CONTACTS",
results: ["Joe" , "Smith" , "Alan" , "Nick" , "Jason"]
)
let searchResultItem2 = SearchResult(
type:"address",
typeTitle: "ADDRESS",
results:["829 6th Street North Fullerton" , "669 Windsor Drive Randallstown" , "423 Front Street Lacey"]
)
var searchResults = [ searchResultItem1, searchResultItem2 ]
现在,话又说回来,为了方便,定义不区分大小写包含函数的字符串:
extension String {
func containsIgnoreCase(substring:String) -> Bool {
return rangeOfString(
substring,
options: .CaseInsensitiveSearch,
range: startIndex..<endIndex,
locale: nil)?.startIndex != nil
}
}
请注意,字符串已经有一个contains
函数,它只是区分大小写,但如果这是足够的,你甚至不需要定义你自己的。现在
,您可以使用map
摆脱不包含搜索字符串的结果:
searchResults = searchResults.map({
return SearchResult(
type: $0.type,
typeTitle: $0.typeTitle,
results: $0.results.filter({
$0.containsIgnoreCase("al")
})
)
})
而且,想必,你也想消除没有实际结果的任何信息搜索结果,所以使用过滤器:
searchResults = searchResults.filter { $0.results.count > 0 }
当然,整个事情可以串成一个表达:
searchResults = searchResults.map({
return SearchResult(
type: $0.type,
typeTitle: $0.typeTitle,
results: $0.results.filter({
$0.contains("al")
})
)
}).filter { $0.results.count > 0 }
而且,你都不可能再利用flatMap
,这就好比map
,但消除了任何nil
值减少一些重复的:
searchResults = searchResults.flatMap {
let results = $0.results.filter { $0.containsIgnoreCase("al") }
if results.count > 0 {
return SearchResult(type: $0.type, typeTitle: $0.typeTitle, results: results)
} else {
return nil
}
}
是的,你是对的。 – Nassif