関数

ここでは Swift の関数 (function) について学びましょう。

関数は例えば、「半径を渡すと面積を返す」 といった特定の処理を行なうコードのまとまりです。

多くのプログラミング言語でサポートされているので、考え方はご存知の方も多いと思います。

関数

Swift では引数及び戻り値などは次のように書きます。

func 関数名 (引数1:引数1の型, ...) -> 戻り値の型 {
	return 戻り値
}

具体的には次のようになります。

func getArea ( r: Double ) -> Double {
	let pi = 3.14
	return pi * r * r
}

print( getArea( r:2 ) )

実行結果

12.56

可変個引数

可変個引数 (variadic parameters) をとる関数は次のように定義できます。

func myfunc ( nums: Int... ){
	for (index, val) in nums.enumerated() {
		print( "\(index) - \(val)" )
	}
}

myfunc( nums:5, 6, 7 )

実行結果

0 - 5
1 - 6
2 - 7

タプルを返す

戻り値の型としてはタプルを指定することも可能です。これによって、複数の値を一度に返すことが可能です。

func getEmployee( empID : Int ) -> ( name: String, age: Int) {
	switch empID {
	case 1000:
		return ( "Ichiro", 30 )
	default:
		return ( "Unknown", 0 )
	}
}

var p1 = getEmployee( empID: 1000 )
print( "\(p1.name) - \(p1.age)" )

var p2 = getEmployee( empID: 5 )
print( "\(p2.name) - \(p2.age)" )

実行結果

Ichiro - 30
Unknown - 0

引数の外部名

これも Swift らしい機能です。引数の外向けの名前を指定することができます。引数の前にもうひとつ付いている名前が、呼び出し側で利用可能です。

func getArea( radius r : Double ) -> Double {
	let pi = 3.14
	return pi * r * r
}

var a = getArea( radius: 3 )
print( a )

引数ラベルの省略を認める場合には、アンダースコア _ を指定します。

func getArea( _ r : Double ) -> Double {
	let pi = 3.14
	return pi * r * r
}

var a = getArea( 3 )
print( a )

関数呼び出し時にラベルを必要としていません。

以前は変数名に # を付けるなどの記述がありましたが、廃止されました。

デフォルト値

関数のパラメータの型に続いて、 = 値 とすることでデフォルト値が設定できます。

通常パラメータは全ての値を渡して呼び出すのですが、デフォルト値を設定することによって呼出側にパラメータを渡すことの省略を許可することができます。

次の例では三つ目の引数にデフォルト値として 1 を設定しています。

func foo( x: Int, y: Int, z: Int = 1 ) -> Int {
		return x * y * z;
}

var a : Int

a = foo( x: 2, y: 3 )
print( a )

実行結果

6

参照 ~ inout 引数

Swift でも参照を渡すことができます。その場合、型の前に inout を指定します。 inout 引数に値を渡すときは & を付けます。

func myfunc1 ( msg : inout String ) {
	msg = "I'm in myfunc1!"
}

var s = "Hello!"
print( "s = \(s)" )

myfunc1( msg: &s )

print( "s = \(s)" )

以前は引数名の前に inout を付けていましたが、型の前に書くように変わりました。

尚、inout 引数ではデフォルト値は設定できません。

関数を返す関数

Swift では関数を返す関数を定義することも可能です。

func f1( d : Double ) -> String {
	return "f1 \(d)"
}

func f2( d : Double ) -> String {
	return "f2 \(d)"
}

func f( i : Int ) -> (Double)-> String {
	switch i {
	case 1:
		return f1
	default:
		return f2
	}
}


var myfunc : (Double)->String

myfunc = f( i:1)
print( myfunc(1.0) )

myfunc = f( i:2)
print( myfunc(2.0) )

実行結果

f1 1.0
f2 2.0

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Swift による iOS 開発入門