関数

プログラミングではある動作をよく使用することがあります。例えば、行列の掛け算などです。そのように頻繁に使用する動作をわざわざ何回も記述するのは面倒です。そのようなルーティン・ワークをまとめておくのが関数です。関数を使えば一回だけ命令を記述すれば、同じ命令をすぐに使用できます。ここでは、Swiftにおける関数の基本的な使い方や参照渡しについて解説します。

関数の定義

関数とは入力があって、それに対応した出力があるものです。ですから、関数名、入力、出力と関数の処理内容を記述すればいいことになります。関数の定義方法は以下の通りです。

func 関数名(入力) -> 出力{処理内容}

で関数は定義する。入力や出力の変数は「データ型1:変数名1, データ型2: 変数名2, …」のように記述する。出力がない場合は「->出力」を省略できる。

では実際に使ってみましょう。2変数入力に対して、足し算と掛け算と和が正かどうかの結果を出力します。

func Sample(x:Int, y:Int)->(sum:Int,times:Int,sum_p:Bool){
    var flag=false
    if x+y>0{
        flag=true
    }
    return(x+y,x*y,flag)
}

var a = 1
var b = -5
var result=Sample(x: a,y: b)
print(result.sum)
print(result.times)
print(result.sum_p)

実行すると以下のようになります。

-4
-5
false

配列の和を計算してみる

配列を関数に渡して計算するということをよくします。配列データの渡し方を、配列の和を計算する関数をつくることで説明します。では、以下のようにコーディングしてみてください。

func Sample(x:[Int])->Int{
    var sum=0
    for i in x{
        sum += i
    }
    return sum
}

var a=[1,3,2,4,5]
var result=Sample(x:a)
print(result)

実行すると以下のようになります。

15

コードをみてわかると思いますが、Sample(a)のようにただ配列を記入するだけで配列が関数へ渡されます。

参照渡し

C言語では、変数のアドレスを渡し、渡した変数を直接制御することができます。例えば、変数aと変数bを関数に渡すと、aとbの値が入れ替わるという関数が実現できます。この参照渡しを実現するにはinoutパラメタというものを使用します。

では、変数aと変数bの値を入れ替える関数を、InOutパラメタで記述してみます。すると以下のようになります。

func swap(x:inout Int, y:inout Int){
    let temp=x
    x=y
    y=temp
}

var a=1
var b=2
swap(x: &a,y: &b)
print(a)
print(b)

すると以下のように出力されます。

2
1

InOutパラメタを使用する際には、関数定義における入力変数の前に「inout」をつけます。そして、関数を使用する際、変数の前に「&」をつけます。これはアドレスを渡すというC言語と同じ意味合いを含んでいます。InOutパラメタにより参照渡しが実現できることはよく使用するので覚えておきましょう。

参照渡しは配列でよく使用するので、先ほどのプログラムを配列で書いてみます。すると以下のようになります。

func swap2(x:inout [Int]){
    let temp=x[0]
    x[0]=x[1]
    x[1]=temp
}

var k=[1,2]
swap2(x: &k)
print(k[0])
print(k[1])

C言語では参照渡しをする際はkのままでしたが、Swiftの場合は配列にも&をつけてswap(&k)とします。C言語に慣れている人はこの点に注意が必要です。

著者:安井 真人(やすい まさと)