関数
ここでは 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