1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

inout引数

Posted at

関数内での引数への再代入を関数外へ反映させたいとき、インアウト引数を使用します。

var userName = ""

func getUserName(user: inout String) {
    if user.isEmpty {
        user = "Watanabe"
    }
    print(user)
}

getUserName(user: &userName)

インアウト引数を使用するには、引数の型の前にinoutキーワードを追加します。
インアウト引数を持つ関数を呼び出す時は、引数の先頭に&をつけます。

ちなみに、普通にinoutをつけずに書いてみると、

var userName = ""

func getUserName(user: String) {
    if user.isEmpty {
        user = "Watanabe"
    }
    print(user)
}

getUserName(user: &userName)

関数内の条件分岐の中で下記のエラーが出てきます。

Cannot assign to value: 'user' is a 'let' constant

関数内でuserを新たに定義しなければいけないと怒られました。

なぜか?

二番目のプログラムで行っているのは値渡しですが、最初に書いたinout引数を使用したプログラムは参照渡しを行っています。
参照渡しとは、変数のアドレスを引き渡すことです。
参照渡しは値ではなくアドレスを渡すので、変数そのものの値が書き換えられ、さらに元の値も失われます。よって値を変更することに成功しました。

参考

[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ) 
https://qiita.com/Hic2770/items/9214487fe031846c286d

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?