Caution

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

Swift辞典

  1. トップページ
  2. Swift辞典
  3. inout / 戻り値の型 / 複数の戻り値

inout / 戻り値の型 / 複数の戻り値

Swiftの『inout』引数は関数外の変数を直接変更できます。また、タプルを使って複数の値を同時に返したり、『@discardableResult』で戻り値を無視できます。

構文
// inout引数(呼び出し時に & を付ける)
func 関数名(_ 引数: inout 型) { }
関数名(&変数名)

// 複数の戻り値(タプル)
func 関数名() -> (型1, 型2) {
    return (値1, 値2)
}

// 名前付きタプルで返す
func 関数名() -> (名前1: 型1, 名前2: 型2) {
    return (名前1: 値1, 名前2: 値2)
}

// @discardableResult
@discardableResult
func 関数名() -> 型 { }
構文一覧
構文概要
inout 型引数を参照渡しにし、関数内で元の変数を変更できます。
&変数名inout引数として渡す際に & を付けます。
-> (型1, 型2)タプルで複数の値を返します。
-> (名前: 型, ...)名前付きタプルで複数の値を返します。
let (a, b) = 関数()タプルの戻り値を分解して受け取ります。
@discardableResult戻り値を使わなくてもコンパイラ警告が出ないようにします。
サンプルコード
// inout: 関数内で元の変数を変更する
func doubleValue(_ value: inout Int) {
    value *= 2
}

var number = 10
doubleValue(&number)
print(number)  // 20

// inoutで2つの値を交換する
func swap<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

var x = "Hello"
var y = "World"
swap(&x, &y)
print(x, y)  // World Hello

// 複数の戻り値(タプル)
func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array {
        if value < currentMin { currentMin = value }
        if value > currentMax { currentMax = value }
    }
    return (min: currentMin, max: currentMax)
}

let result = minMax(array: [3, 1, 7, 2, 9, 4])
print("最小: \(result.min), 最大: \(result.max)")

// タプルの分解
let (minimum, maximum) = minMax(array: [5, 2, 8, 1, 6])
print("最小: \(minimum), 最大: \(maximum)")

// @discardableResult
@discardableResult
func updateCache() -> Bool {
    // キャッシュ更新処理
    return true
}

updateCache()  // 戻り値を無視しても警告なし
概要

Swiftの関数引数はデフォルトで値渡しです。関数内で元の変数を変更したい場合は『inout』を使い、呼び出し時に『&』を付けます。Swift標準ライブラリの『swap(_:_:)』も同じ仕組みで実装されています。

複数の戻り値を返したい場合は名前付きタプルが便利です。inout引数に定数(let)やリテラルは渡せません。変数(var)のみ渡せます。また、inoutパラメータはデフォルト値を持てません。

関数の基本定義についてはfunc / 引数ラベル / デフォルト引数を参照してください。

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