標籤:swift
看 Developing IOS 8 Apps with swift 的時候看到一些比較有用的點,記錄一下:
1、將函數作為參數傳遞。例如:
寫一個兩個數求和的函數:performOperation(multiply)
<span style="white-space:pre"></span>func performOperation(operation:(Double,Double) -> Double) { if operandStack.count >= 2 { dispalayValue = operation(operandStack.removeLast(),operandStack.removeLast()) enter() } } func multiply(op1: Double, op2: Double) -> Double { return op1 * op2 }
以上,有更酷的實現,用閉包的方法:
改進為:
<span style="white-space:pre"></span>performOperation ({ (op1: Double, op2: Double) -> Double in return op1 * op2 }) func performOperation(operation:(Double,Double) -> Double) { if operandStack.count >= 2 { dispalayValue = operation(operandStack.removeLast(),operandStack.removeLast()) enter() } }
編譯器會根據上下文推斷類型,所以,以上的 performOperaion 又可以簡化為:
<span style="white-space:pre"></span>performOperation ({ (op1, op2) in return op1 * op2 })
op1,op2 的類型可以推斷,當然傳回型別也可以推斷,故而傳回型別也可省去,甚至連 return 也可以省去。
由於編譯器不強制你一定要寫形參,故這裡的 op1, op2 也可以省去,用 $0, $1, $2, ...... 分別代表第一個第二第三個參數等等,
所以,上面又可以再次簡化為:
<span style="white-space:pre"></span>performOperation ({ op1 * op2 })
swift 的編譯器真 TMD 只能,哈哈!
等等,還沒完,
再簡化為:
<span style="white-space:pre"></span>performOperation () <span style="font-family: Arial, Helvetica, sans-serif;">{ op1 * op2 }</span>
有個條件,就是 op1 * op2 是作為最後一個參數傳遞的時候就可以這樣做,把函數參數移到括弧外面,如上。其他的,如果有另外的參數的話就可以像之前的那樣放在括弧()裡面;如果只有一個參數的話,括弧還可以直接去掉,如下:
<span style="white-space:pre"></span>performOperation <span style="font-family: Arial, Helvetica, sans-serif;">{ op1 * op2 }</span>
至此,簡化完畢。
2、swift 支援多態,What an amazing !
例如,當你要求一個數的平方根的時候,而已還是想用回原來的函數 performOperation ,但是這個函數要求的形參是一個包含兩個 Double 類型的函數,求平方根只需要傳入一個參數就行了啊,那麼來改造一下這個函數吧,在寫一個同名的函數 performOperation ,然後定義為只需要一個形參就好了。
注意:swift 支援在一個類中同時存在同名的多個函數,形參不一樣就好了,就是多態啦~
那麼,再增加一個 performOperation 函數,如下:
<span style="white-space:pre"></span>func performOperation(operation: Double -> Double) { if operandStack.count >= 1 { dispalayValue = operation(operandStack.removeLast()) enter() } }
現在就可以這樣調用來計算數值平方根了。
<span style="white-space:pre"></span>performOperation { sqrt($0) }
更多,可以觀看《Developing IOS 8 Apps with Swift》的 More Xcode and Swift, MVC 一節。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
swift 學習筆記一