Skip to content

Instantly share code, notes, and snippets.

@SatoTakeshiX
Last active January 6, 2016 04:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SatoTakeshiX/b2edeb058d32559d730a to your computer and use it in GitHub Desktop.
Save SatoTakeshiX/b2edeb058d32559d730a to your computer and use it in GitHub Desktop.
swift クロージャーのサンプルコード
//: 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