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è)讓你寫一個函數(shù)來實現(xiàn)篩選后綴是.swift
的文件,你該如何實現(xiàn)?
思路:首先聲明一個數(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ù)的局限性—————僅適用篩選后綴是.swift
的文件。因此我們需要自己指定篩選條件,而這個篩選條件是一個類型為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ù)顯然仍有不足,缺少什么呢?恩....對!泛型,現(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
}
看來又實現(xiàn)了一個自定義的方法,不妨試試好用不好用。
why coding like this 系列,更多是用
Why
,How
看待代碼,摒棄那種我只要會寫,至于為什么?因為我一直那么寫
的思想。希望對大家有幫助! 下文帶來reduce的揭秘。