今回は関数定義を試してみます。
func
func 関数名(引数型) -> 返り値型 {} という形式です。
- 普通な感じです。
func
// いわゆるprocedure
func procedureStyle(a:String , b:Int , c:Bool) {
print(a , b , c)
}
// 2つめ以降は引数名も指定する
procedureStyle("文字",b:123,c:true) // 文字 123 true
// いわゆるfunction
func functionStyle(a:String , b:Int , c:Bool) -> String {
return a + " " + String(b) + " " + String(c)
}
print(functionStyle("文字",b:123,c:true)) // 文字 123 true
- Objective-Cを見たことある人には、ラベル名を指定するのも慣れてると思います。
ラベルとデフォルト
- ラベルとデフォルト値が指定できます。
ラベルとデフォルト
// 引数にはラベルが使えます。
func labelStyle(moji a:String , kazu b:Int , bool c:Bool) -> String {
return a + " " + String(b) + " " + String(c)
}
// ラベルを明示して呼び出します。
print(labelStyle( moji:"文字", kazu:123, bool:true)) // 文字 123 true
// デフォルト値も指定できます。
func defaultStyle(moji a:String = "NULL" , kazu b:Int = 0 , bool c:Bool = false) -> String {
return a + " " + String(b) + " " + String(c)
}
// 空だとデフォルト値が使われます。
print(defaultStyle()) // NULL 0 false
- 個人的にはラベルが好きですね。func(1,2,"aaa",false)とかって書かれててもわかりにくいしね。
ラベルを指定しないようにする。
- アンダーバー(_)を加えると、他の言語のようにラベルを使わないようにもできました。
ラベルなし
func noLabelStyle( a:String , _ b:Int , _ c:Bool) -> String {
return a + " " + String(b) + " " + String(c)
}
// ラベルを明示して呼び出します。
print(noLabelStyle( "文字", 123, true)) // 文字 123 true
- ひとつ目の引数のところには、そもそも要りません。
複数の返り値
- 複数の値を返すこともできます。
複数の返り値
// 複数の返り値もできます。
func tupleResponse(moji a:String , kazu b:Int , bool c:Bool) -> (String , Int , Bool) {
return ( a, b, c )
}
print(tupleResponse(moji:"文字",kazu:123,bool:true)) // ("文字", 123, true)
- ま、perlならよゆーですけど。
引数が可変
- 引数を可変にできます。Objective-Cっぽいですね。
可変引数
// 引数の数が可変
func variableStyle(nums:Int...) {
print(nums)
}
variableStyle(1,2,3,4) // [1, 2, 3, 4]
- 配列できますね。ただし1種類しか使えません。
-
func variableStyle(nums:Int...,strs:String...)
はNGでした。
関数を返す
- 関数を返すこともできます。
関数
// 返り値に関数を返すこともできる。
func returnFunc(isType:Bool) -> (String)->(String) {
func fa(str:String) -> String {
return "HELLO , \(str)"
}
func fb(str:String) -> String {
return "BYE , \(str)"
}
return isType ? fa : fb
}
let ff = returnFunc(true)
print(ff("John")) // HELLO , John
print(returnFunc(true)("Jobs")) // HELLO , Jobs
print(returnFunc(false)("Tim")) // BYE , Tim```
- JavaScriptっぽいですね。イマドキです。
まとめ
- 関数定義はふつうな感じです。
- Objective-Cっぽくもあり、JavaScriptっぽい感じもします。
今日はここまで
- 次はクラス定義に進む前に、細々とした関数や用法を試そうと思います。