2.Filter函數(shù)揭秘
Topic 2:
請用Filter
函數(shù)篩選出String
數(shù)組中后綴是.swift
的文件。
Example:
//例一:
var filesNeedToFilter = ["ViewController.swift","HelloWorld.c","Web.java","Person.swift","Main.c"]
//輸出["ViewController.swift","Person.swift"]
filesNeedToFilter.filter{
file in
file.hasSuffix(".swift")//注意suffix是后綴的意思
}
why coding like this?
命題:假設(shè)讓你寫一個(gè)函數(shù)來實(shí)現(xiàn)篩選后綴是.swift
的文件,你該如何實(shí)現(xiàn)?
思路:首先聲明一個(gè)數(shù)組用于保存符合的結(jié)果值谢揪,然后遍歷需要篩選的數(shù)組扭弧,通過hasSufffix
函數(shù)返回true or false
來判斷數(shù)組元素是否含有指定的后綴阎姥。
代碼:
//例二:
func getSwiftFiles(files:[String])->[String]{
var result:[String] = []
for file in files{
if file.hasSuffix(".swift"){
result.append(file)
}
}
return result
}
//不妨來試試//輸出["ViewController.swift","Person.swift"]
getSwiftFiles(filesNeedToFilter)
我們注意到只有滿足給定的篩選條件,這里是file.hasSuffix(".swift")
返回true
表示包含后綴鸽捻,反之不包含呼巴。
通過Map章節(jié)學(xué)習(xí)后泽腮,立馬意識(shí)到該函數(shù)的局限性—————僅適用篩選后綴是.swift
的文件。因此我們需要自己指定篩選條件衣赶,而這個(gè)篩選條件是一個(gè)類型為String->Bool
的閉包诊赊,String表示傳入需要條件判斷的元素,滿足返回true
府瞄,不滿足返回false
碧磅,這也是為什么閉包返回Bool
的原因了。修改后的代碼如下:
//例三:
func getFilesByCondition(files:[String],f:String->Bool)->[String]{
var result:[String] = []
for file in files{
if f(file){
result.append(file)
}
}
return result
}
//不妨來試試 采用closure的尾包形式
getFilesByCondition(filesNeedToFilter){
file in
file.hasSuffix(".c")//返回["HelloWorld.c", "Main.c"]
}
現(xiàn)在可以隨心所欲的傳入篩選條件了遵馆,但是該函數(shù)顯然仍有不足鲸郊,缺少什么呢?恩....對(duì)货邓!泛型秆撮,現(xiàn)在傳入的數(shù)組不能局
限于String類型,那么作為泛型我們就要使用T
來泛指所有類型嘍(注意泛型并沒有特別指明要用T
,U
,你可以自由給定逻恐,建議使用大寫以及駝峰寫法)像吻。改寫代碼如下:
//例四:
func myFilter<T>(xs:[T],check:T->Bool)->[T]{
var result:[T] = []
for x in xs{
//必須經(jīng)過條件判斷才可以
if check(x){
result.append(x)
}
}
return result
}
看來又實(shí)現(xiàn)了一個(gè)自定義的方法,不妨試試好用不好用复隆。
why coding like this 系列拨匆,更多是用
Why
,How
看待代碼,摒棄那種我只要會(huì)寫,至于為什么挽拂?因?yàn)槲乙恢蹦敲磳?/code>的思想惭每。希望對(duì)大家有幫助! 下文帶來reduce的揭秘亏栈。