LoginSignup
14
14

More than 5 years have passed since last update.

Swift さくっと確認したい基礎文法 [関数オブジェクト]

Last updated at Posted at 2015-04-26

関数オブジェクト

関数をオブジェクトのように
変数に代入したり、関数の引数に渡したりすることができます。

今回は下記の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内に
getDomesticPricegetForeignPriceという二つの関数があります。

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が入ります。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14