正如其他两个答案所指出的那样,您正在搜索结果数组以查找值为“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 ]
那么,再次为方便起见,为 String 定义一个不区分大小写的 contains 函数:
extension String {
func containsIgnoreCase(substring:String) -> Bool {
return rangeOfString(
substring,
options: .CaseInsensitiveSearch,
range: startIndex..<endIndex,
locale: nil)?.startIndex != nil
}
}
请注意,String 已经有一个contains 函数,它只是区分大小写,但如果这足够了,您甚至不需要定义自己的。
现在,您可以使用map 删除不包含您的搜索字符串的结果:
searchResults = searchResults.map({
return SearchResult(
type: $0.type,
typeTitle: $0.typeTitle,
results: $0.results.filter({
$0.containsIgnoreCase("al")
})
)
})
而且,大概你还想消除任何没有实际结果的 SearchResult,所以使用过滤器:
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
}
}