関数オブジェクト
関数をオブジェクトのように
変数に代入したり、関数の引数に渡したりすることができます。
今回は下記の3つの方法をまとめました。
①関数を変数に代入
②関数を引数に指定
③関数を戻り値に指定
①関数を変数に代入
以下のように書くことで
定義した関数を変数に代入して利用することができます。
/* 消費税込みの金額を取得します。 */
func getPrice(#price:Double) -> Int{
return Int(price * 1.08)
}
// getPrice()を代入
let myGetPrice = getPrice
// コーヒーの値段
let COFFEE_PRICE:Double = 300
// 代入先のmyGetPriceからgetPriceを実行
let coffeePrice = myGetPrice(price:COFFEE_PRICE)
println(coffeePrice) // 324
②関数を引数に指定
下記のように、
関数の引数に(引数:引数の型 -> 戻り値の型)
を指定することで、
関数を引数に指定することができます。
func 関数名(引数:引数の型 -> 戻り値の型) -> 戻り値の型 {
引数()
return 戻り値
}
例を見てみましょう。
下記の例では、
関数getTotalPrice
に関数getPriceJPY
と関数getPriceSWE
を渡しています。
これによって関数getTotalPrice
内で、
受け取った関数をgetPriceFunc
として利用しています。
/* 日本の消費税で税込み価格を取得 */
func getPriceJPY(#price:Double) -> Int{
return Int(price * 1.08)
}
/* スウェーデンの消費税で税込み価格を取得 */
func getPriceSWE(#price:Double) -> Int{
return Int(price * 1.25)
}
// コーヒーの値段
let COFFEE_PRICE:Double = 300
/* 指定した金額と個数の税込み価格を取得します。 */
func getTotalPrice(#getPriceFunc:(Double) -> Int, #price:Double, #count:Int) -> Int {
return getPriceFunc(price) * count
}
getTotalPrice(getPriceFunc: getPriceJPY, price: COFFEE_PRICE, count: 3) // 972
getTotalPrice(getPriceFunc: getPriceSWE, price: COFFEE_PRICE, count: 3) // 1125
③関数を戻り値に指定
下記のように、
関数の戻り値に(引数:引数の型) -> 戻り値の型
を指定することで、
関数を戻り値に指定することができます。
func 関数名(引数:引数の型) -> (引数:引数の型) -> 戻り値の型 {
func
return 戻り値
}
例を見てみましょう。
国コードを指定して、
国内と国外で異なる手数料込みの金額を取得するコードです。
※enumを使ってもっと良い書き方ができますが、
今回は関数を戻り値にする例ということで悪しからず。。。
getPriceFunc
内に
getDomesticPrice
とgetForeignPrice
という二つの関数があります。
getPriceFunc
は引数に指定したCountryCodeが
CountryCode.JPN
であればgetDomesticPrice
を
それ以外であればgetForeignPrice
を返す関数になります。
/* 国コード */
enum CountryCode {
case JPN // 日本
case KOR // 韓国
case CHN // 中国
}
/* 手数料込みの値段を取得する関数を取得。 */
func getPriceFunc(countryCode:CountryCode) -> (price:Double) -> Int {
/* 国内用(日本) */
func getDomesticPrice(#price:Double) -> Int {
return Int(price * 1.05)
}
/* 国外用(日本以外) */
func getForeginPrice(#price:Double) -> Int {
return Int(price * 1.25)
}
/* 指定したcountryCodeによって返す関数を分岐 */
if countryCode == CountryCode.JPN {
return getDomesticPrice
}else{
return getForeginPrice
}
}
// 関数getDomesticPriceのオブジェクト
var getPriceForJPN = getPriceFunc(CountryCode.JPN)
// 関数getForeginPriceのオブジェクト
var getPriceForCHN = getPriceFunc(CountryCode.CHN)
println(getPriceForJPN(price: 3000)) // 3150
println(getPriceForCHN(price: 3000)) // 3750
getPriceForJPN
にはgetPriceFunc
で
CountryCode.JPN
を指定しているので
getDomesticPriceが入ります。
getPriceForCHN
にはgetPriceFunc
に
CountryCode.JPN
ではない値を指定しているので
getForeignPriceが入ります。