追記: 2016/9/19
Swift3.0版はこちらです
http://qiita.com/merrill/items/2a2a069771cb89d5499b
関数
引数なし・戻り値なし
func hello() {
print("Hello!")
}
引数なし・戻り値あり
func hoge() -> Int {
return 100
}
引数あり・戻り値あり
func hoge(num: Int) -> Int {
return num
}
hoge(100)
引数あり(複数)
func hoge(a: Int, b: String) {
print(a)
print(b)
}
hoge(100, "テスト")
引数あり(複数かつ数を指定しない)
引数の値は配列として格納される。
func hoge(a: Int...) {
print(a[0])
print(a[1])
}
hoge(100, 200)
引数あり(初期値を設定)
func hoge(a: Int = 100) {
print(a)
}
hoge() // => 100
hoge(a: 200) // => 200 ※引数にデフォルト値を指定した場合は、引数のラベル名が必要になる!
引数を使って変数宣言
引数のパラメータは、通常定数(let)として扱われるので、値を代入することはできない。
func hoge(a: Int) {
a = 200 // エラー
}
hoge(100)
ただし、引数でvar宣言をしてあげるとエラーにならない。
func hoge(var a: Int) {
a = 200 // OK
}
hoge(100)
名前付き引数(外部引数)を使う
引数の変数名の前に#
をつける。
func hoge(#a: Int) {
print(a)
}
hoge(a: 100)
第2引数以降は、自動的に引数名が名前付き引数となるので#はつけない。
func hoge(#a: Int, b: Int) {
print(a)
print(b)
}
hoge(a: 100, b: 200)
あまりないと思うが、引数名とは別名で指定したい場合は、以下のように書ける。
func hoge(num a: Int) {
print(a)
}
hoge(num: 100)
戻り値が複数
タプルを使用する。
func compareNumber(arr: [Int]) -> (min: Int, max: Int) {
var min = minElement(arr)
var max = maxElement(arr)
return (min, max)
}
var result = compareNumber([1,2,3,4,5,6,7,8,9,10])
result.min // => 1
result.max // => 10
オーバーロード
引数の数や、外部引数の名前が異なれば、同じ名前の関数をたくさん定義できる。
func hoge() {
print(100)
}
func hoge(#a: Int) {
print(a)
}
func hoge(#b: Int) {
print(b)
}
hoge() // => 100
hoge(a: 200) // => 200
hoge(b: 300) // => 300
クロージャ
名前がない関数。{}で囲まれたブロック。メソッドのように呼び出すのではなく、その場で実行される。関数の引数でよく利用される。
引数なし・戻り値なし
型は () -> Void
{() -> void in
...
}
引数あり・戻り値なし
型は (a: Int) -> Void
{(a: Int) -> void in
...
}
引数あり・戻り値あり
型は (a: Int) -> Int
{(a: Int) -> Int in
...
}
クロージャを変数に入れることも可能
var plus = { (a: Int, b: Int) -> Int in a + b }
サーバリクエストのコールバックとして、クロージャを引数で受け取る関数を書くのはよく使われる。
# requestメソッド呼び出し
request(
params: params,
success: {() -> Void in
println("通信成功")
},
error: {() -> Void in
println("通信エラー")
}
)
# クロージャを受け取るrequestメソッド
func request(request: request, success: () -> Void, error: () -> Void) {
//渡されたクロージャを実行する
success()
}
クロージャを渡さず nil を渡す場合は、クロージャを Optional にできる。
func request(success: (()->Void)?) {
success?()
}