2014年6月14日土曜日

Swift Tour (2)

引き続き The Swift Programming Language から A Swift Tour を要約する.

関数は次のように定義する.

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

関数定義はPascalとHaskellを混ぜたようなスタイルだ.(注:SwiftではPascalのように仮引数名の前にvarをつけることができるが意味はPascalと異なる.PascalのvarはSwiftのinoutに相当する.)

関数内で関数を定義できる.関数は第一級オブジェクトで,レキシカルクロージャになる.

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

関数は関数引数を取ることが出来る.

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

{ (parameters) -> return_type in statements } 構文を使えば名無し関数(クロージャ)をその場で作ることが出来る.

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

クロージャ構文はRubyに近い.例えば

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

なるnamesを逆順ソートするために標準関数sortに渡すことを考える.

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = sort(names, backwards)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

名無し関数を使っても良い.

reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 })

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

型推論が効くので型名は省略できる.

reversed = sort(names, { s1, s2 in return s1 > s2 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

1行野郎に朗報.returnは省略できる.クロージャの中の唯一の式がreturn文ならreturnを省略できる.

reversed = sort(names, { s1, s2 in s1 > s2 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

そして,LLのように引数を表すビルトイン変数がある.

reversed = sort(names, { $0 > $1 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

ていうか,オペレータ<をそのまま渡せばよかったのかもしれない.

reversed = sort(names, >)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

もう一つ面白い話題を.関数の最後の引数のクロージャは外に出せる.

reversed = sort(names) { $0 > $1 }

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

0 件のコメント:

コメントを投稿