Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

今日はここまで

  • 次はクラス定義に進む前に、細々とした関数や用法を試そうと思います。
qoAop
こんにちは。 PerlとJavaScriptが好きだったんですが、最近はFirebase,Vue.jsです。 マネージドサービスってすごいですね。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away