ども木村です。この記事ではSwiftにおける関数(function)の使い方について解説します。
本記事のサンプルスクリプトはPlaygroundで実行しながら見ていただくことを推奨しています。Playgroundの導入/使い方についてはこちらを参考ください。
本記事の実行環境は以下になっています。
- Xcode Version 12.3
- Playgrounds Version 3.4.1
- macOS Version 11.4
関数(function)の実装方法
関数(function)とは一連の処理の流れをまとめたプログラムです。この関数を作成すると、別の場所でも同じように再利用し、同じ処理を実行することが可能になります。
まずは、簡単な関数の処理を実装し、イメージを掴んでいきましょう。
以下はsayHello()という形で呼び出され、「Hello」と応答する関数の定義をする例です。
func sayHello() {
let message = "hello"
print(message)
}
呼び出す際には以下のように記述します。
sayHello()
関数(function)に引数を設定する
関数に特定の値を渡して、その値を利用して処理を行いたい場合は以下のように記述します。
func sayHello(message: String) {
print(message)
}
sayHello(message: "hello") //関数の呼び出し
関数に戻り値を設定する場合
現在は関数の中でprintメソッドを使って文字列を出力しています。
「hello」を関数の返り値として、呼び出し元に返却したい場合は以下のようにreturnを使用します。
関数の処理の中でhelloをhiという文字列に上書きして呼び出し元に返却しています。
func sayHello(message: String) -> String {
var test = message
test = "hi"
return test
}
var result = sayHello(message: "hello")
print(result)
関数の引数(パラーメータ)を外部呼び出し用と内部処理用に分ける
ちなみにsayHello関数で引数のパラメーターとして定義しているmessageのパラメーターを外部呼び出し用と内部処理用の名前とで分けて定義することも可能です。その場合以下のように記載します。
このときmessageAは外部呼び出し用、messageBは内部処理用のパラメータとして定義しています。
それぞれのパラメータは外部呼び出し時に設定した「hello」が設定されています。
func sayHello(messageA messageB: String) -> String {
return messageB
}
var result = sayHello(messageA: "hello")
print(result)
もし外部パラメーターを付与せずに関数を実行したい場合、「アンダースコア(_)」を設定することでパラメーター名を記載することなく関数を実行できます。
func sayHello(_ messageB: String) -> String {
return messageB
}
var result = sayHello("hello")
print(result)
デフォルトパラメーターを設定する
引数に対してデフォルトな値をあらかじめ設定することが可能です。
func sayHello(_ messageB: String, flg: Bool = true){
if flg == true {
print(messageB)
} else {
print("no message")
}
}
sayHello("hello")
sayHello("hello",flg: false)
関数の引数に複数の値を設定する
関数の引数には同じ方の変数を複数設定することができます。具体的には以下のように実装することが可能です。型の前にドットを連続して三つ記載します。
func test(nums: Int...) {
for num in nums {
print(num+num)
}
}
test(nums: 1, 2, 3, 4, 5)
エラー処理の実装
関数内でエラーが発生した際の処理として、enumを使ってエラー時の処理をあらかじめ定義しておくと便利です。throwが実行さればtry/catchにてエラーを検知することができます。
enum PrintError: Error {
case obvious
}
func testPrint(_ name: String) throws -> Bool {
if name == "test" {
throw PrintError.obvious
}
return true
}
do {
try testPrint("test")
print("OK")
} catch {
print("NG")
}
引数に設定された関数外の変数を変更する
引数に設定された変数は関数の中で定数として利用され、関数外の変数の値を変更することができません。
そのため、関数外の変数の値も変更したい場合は、引数の定義で「inout」を設定します。
func test(num: inout Int) {
num *= 2
}
var testNum = 10
print(testNum)
test(num: &testNum)
print(testNum)