Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Swift入門編 - 返り値(戻り値)とreturnについて

返り値(戻り値)とreturnについて

みなさまどうも。

さて、続きまして『return』とか『返り値』(戻り値)についてやっていきましょう。

これまで関数の定義方法について解説してきましたが、実は関数には「実行した際に何かを返すこともできる」という機能があったりします。

なんのこっちゃってお話なんですが、例えば「引数に渡ってきた値をこにょこにょしてその結果を変数とかに代入したい」という処理を構築したい気分になったとしましょう。

そんな時に『return』とか『返り値』とかを使用することで望みを実現することができます。というわけでサンプルをどん。

func test(n: Int) -> Int {
    return n
}

let num = test(n: 10)

print(num) // 数値『10』が出力されます。

これが『return』と『返り値』を使用したパターンになります。ではいつも通り文法を確認していきましょう。

まず『func test(n: Int)』という部分はこれまで通りでOKです。注目するべきはその右側になります。なにやら『-> Int』って記述してありますね。このようにSwiftでは「『戻り値』として返したいデータのデータ型を指定する」必要があります。

返したいデータ型を指定するには上記のように『-> データ型』という感じで記述します。これがないとエラーになっちゃいますので要注意です。

func test(n: Int) { // 『-> データ型』の記述がないためエラーです。
    return n
}

返したいデータ型を指定したら関数の中身の方で『return』を記述してあげましょう。その『return』の隣に半角スペースとかを置いて返したいデータを記述してあげます。

「引数で受け取った文字列をそのまま返す」という処理を構築するとなると以下のような形になります。

func test(s: String) -> String {
    return s
}

let str = test(s: "初音ミク") // 関数『test』で返された文字列を定数『str』で受け取ります。

print(str) // 文字列『初音ミク』が出力されます。

そんでもって『-> データ型』と記述しているにも関わらず、関数の中身で何もデータを返さないとエラーになっちゃいます。こちらも気をつけて下さい。

func test(s: String) -> String { // エラーです。『-> データ型』を記述した場合はちゃんとデータを返すようにしないとダメだったりします。

}

基本的なところはこんな感じですね。ちなみに『return』の右側に演算式を置いてもOKです。以下は『n + _n』の演算結果が『return』される、という形になります。

func test(n: Int, _n: Int) -> Int {
    return n + _n // こんな感じで演算式を書いてもOKです。
}

let num = test(n: 10, _n: 20)

print(num) // 数値『30』が出力されます。

では続いて応用技を幾つか紹介したいと思います。

まず「『return』を使うとそこで関数の処理が停止になる」という動作についてです。以下のサンプルを見てみて下さい。

func test(n: Int) -> Int {
    return n // ここで処理が停止されます。

    print(n) // ここは実行されません。
}

let num = test(n: 10)

print(num) // 数値『10』が出力されます。

上記の『print(n)』というところに注目です。その手前に『return n』が記述されているためその時点でこの関数の処理は終了させられ、この『print(n)』は実行されることはありません。

この『return』の使い方はかなり有益なので覚えておくようにして下さい。

ちなみにこれはデータを返さない関数でも使用することができます。以下のような形ですね。

func test() {
    return; // ここで処理が停止されます。

    print("初音ミク") // ここは実行されません。
}

test()

上記のサンプルでは『-> データ型』と記述していないわけですが、単独で『return』を記述することで関数の処理を抜けることができちゃいます。

さて、このパターンで『return』を使用する場合にちょっと注意点があります。上記の『return』の部分に注目してみて下さい。何やら『;』が記述してあって『return;』となってますね。

Swiftでは文の終わりを『;』で教えてあげることができるのですが、上記の場合はこれがないと『print("初音ミク")』を『return』するという処理になってしまうため、『print("初音ミク")』が実行されちゃったりします。

func test() {
    return // 『;』を抜きます。

    print("初音ミク") // この処理が『return』されるという処理になるため実行されちゃいます。
}

test() // 文字列『初音ミク』が出力されます。

「『return』は右側に半角スペースとか改行とかを挟んで記述してあるものを返す」という処理になるので上記のような結果になっちゃいます。

ちょっとプログラミングに慣れてないとややこしいかもですが間違えないように気をつけて下さい。

続いて「配列または辞書を返すようにする」というパターンです。

まだ「配列または辞書を引数として渡す関数」のサンプルを紹介していなかったのでまずそちらから確認していきましょう。こんな感じになりますね。

func test(arr: [Int]) { // Int型な配列を受け取れるようにします。
    print(arr)
}

func test1(dic: [String: Int]) { // キーがString型、値がInt型な辞書を受け取れるようにします。
    print(dic)
}

test(arr: [0, 1, 2]) // 『[0, 1, 2]』が出力されます。
test1(dic: ["初音ミク": 0, "Lily": 1]) // 『["Lily": 1, "初音ミク": 0]』が出力されます。

引数に『arr: [Int]』といったように『仮引数名: [データ型]』とすれば配列を、『dic: [String: Int]』といったように『仮引数名: [データ型: データ型]』とすれば辞書を受け取ることができるようになります。

実行する際の『()』の中は『arr: [0, 1, 2]』といったように『仮引数名: 配列または辞書』という形になりますね。

さて、配列や辞書を返すようにするにはこれまでと同じように記述すればOKです。配列を返したいなら『-> [データ型]』、辞書を返したいなら『-> [データ型: データ型]』と記述するような形ですね。こんな感じです。

func test(arr: [Int]) -> [Int] { // Int型な配列を返します。
    return arr
}

func test1(dic: [String: Int]) -> [String: Int] { // キーがString型、値がInt型な辞書を返します。
    return dic
}

let a = test(arr: [0, 1, 2]) // 『[0, 1, 2]』が出力されます。
let d = test1(dic: ["初音ミク": 0, "Lily": 1]) // 『["Lily": 1, "初音ミク": 0]』が出力されます。

print(a) // 『[0, 1, 2]』が出力されます。
print(d) // 『["Lily": 1, "初音ミク": 0]』が出力されます。

というわけでとりあえずの『return』とか『返り値』の使い方についてはこんな感じですね。

さらにもういっちょ応用技で、『()』を使うことで複数の値とかを返すことができちゃったりします。これは『タプル』と呼ばれるものになりますね。

func test(n: Int, s: String) -> (Int, String) {
    return (n, s)
}

let tpl = test(n: 10, s: "初音ミク")

print(tpl) // 『(10, "初音ミク")』と出力されます。

続いての記事でこの『タプル』について勉強していきましょう。ではではこの辺で。失礼します。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。