Last active
January 6, 2016 04:28
-
-
Save SatoTakeshiX/b2edeb058d32559d730a to your computer and use it in GitHub Desktop.
swift クロージャーのサンプルコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: Playground - noun: a place where people can play | |
import UIKit | |
/* | |
ネスト関数でクロージャーを作る。 | |
*/ | |
func outer() -> () ->Void{ | |
var x = 10 | |
func inner(){ | |
print("X is \(x)") | |
x = x + 1//inner関数で定義されていないx変数を操作している。 | |
} | |
return inner//関数を返り値として返している | |
} | |
var f = outer() | |
f()//-> X is 10 | |
f()//-> X is 11 | |
f()//-> X is 12 | |
/* | |
sort(_:)メソッドを使ってクロージャーをもっと見てみる | |
*/ | |
let name = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] | |
/* | |
関数を定義してみる | |
*/ | |
func backwards(s1: String, _ s2: String) -> Bool{ | |
return s1 > s2 | |
} | |
var reversed = name.sort(backwards) | |
print(reversed) | |
/* | |
無名関数で実行してみる | |
*/ | |
reversed = name.sort({ (s1:String, s2: String) -> Bool in | |
return s1 > s2 | |
}) | |
print(reversed) | |
/* | |
Swiftは型を推定。 | |
配列の型は推定できるから(String, String) -> Boolの記述は省略できる | |
*/ | |
reversed = name.sort({ | |
s1, s2 in return s1 > s2 | |
}) | |
print(reversed) | |
/* | |
処理を単式で書いた場合は戻り値は暗黙に返される。なので'return'の文字はいらない | |
*/ | |
reversed = name.sort({s1, s2 in s1 > s2}) | |
print(reversed) | |
/* | |
略式の引数名 | |
クロージャーには自動的に引数に名前がつけられている | |
$0,$1,$2 | |
これを使うと、引数の定義をしなくてもいいし、 inの文字もいらない | |
*/ | |
reversed = name.sort({ $0 > $1}) | |
print(reversed) | |
/* | |
オペレーター関数を使う | |
SwiftのString型は > が使える。 > は2つのString型引数をもち、戻り値としてBool型を返す。 | |
sort(_:)にぴったり | |
*/ | |
reversed = name.sort(>) | |
print(reversed) | |
//----------- | |
/* | |
Trailing Closures | |
関数の引数の末尾(最後)がclosureを受け取る場合、処理部分を外に配置できる | |
*/ | |
// closureを受け取る関数の定義。 | |
// 「(Int, Int) -> Int」という型の関数を受け取る | |
func add(a: Int, b: Int, closure: (Int, Int) -> Int) -> Int { | |
return closure(a, b) | |
} | |
// addを普通に使う | |
add(1, b: 5, closure: { (a: Int, b: Int) -> Int in | |
return a + b | |
}) | |
// Trailing版 | |
// 実際の処理を引数の()の外に置いている | |
add(1, b: 5) { | |
$0 + $1 | |
} | |
/** | |
sort関数でもTrailing Closuresを使ってみる | |
*/ | |
reversed = name.sort(){ | |
$0 > $1 | |
} | |
print(reversed) | |
/* | |
Trailing Closuresで、引数がクロージャー以外なかったら()を省略できる | |
*/ | |
reversed = name.sort{ | |
$0 > $1 | |
} | |
print(reversed) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment