LoginSignup
4
6

More than 5 years have passed since last update.

Swiftはじめたい...その9 関数定義

Last updated at Posted at 2016-01-16

今回は関数定義を試してみます。

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っぽい感じもします。

今日はここまで

  • 次はクラス定義に進む前に、細々とした関数や用法を試そうと思います。
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6