Swift 関数宣言 - shirajira/family-account-ios GitHub Wiki

Swift 関数宣言

基本

// 引数と戻り値がある場合
func double(x: Int) -> Int {
    return x * 2
}

// 引数も戻り値もない場合
func sayHello() {
    print("Hello")
}

コールするときには引数ラベルが必要。

let result = double(x: 12)  // 24 will be returned.

ラベルの応用

ラベルを省略する

省略しても問題ないラベルの前に _ を付与する。

func swap(_ v1: MyType, _ v2: MyType) {
    // ...
}
var data1: MyType = ...
var data2: MyType = ...

// 入れ替える
swap(data1, data2)

実質的にラベルに意味がない場合などに有用。
省略しすぎると可読性を損なう恐れがあるので,用法用量を守って正しくお使いください。

ラベルに別名をつける

ラベルの前に別名を付与する。
以下の例では onobject の別名になっている。

func put(_ item: Food, on object: Furniture) {
    // ...
}

コールするときは object ではなく on を使う。

put(apple, on: table)

コールしたときに英文になるようにデザインすると,可読性がマシマシになる。

Put an apple on the table.

みたいな。動作がイメージしやすいですね。

複数の戻り値

少し変わったところでは,こんな実装もできる。

func getScreenSize() -> (width: CGFloat, height: CGFloat) {
    let width = ...
    let height = ...
    return (width, height)
}

コールするときは適当な変数に受けて,宣言時に命名したラベルでアクセスすればよい。

// スクリーンサイズを求める
let screen = getScreenSize()

// 面積を求める
let area = screen.width * screen.height

可読性に留意して活用すること。

戻り値を省略する

以下のような関数 method が定義されているとき,

func method() -> Bool {
    return doSomething()
}

これを他の場所からコールする場合,戻り値を受け取らない以下のような書き方をすると,

func execute() {
    method()
}

Result of call to 'method()' is unused

という警告が出てしまう。
この警告を回避するには以下のように記述する必要があるが,

func execute() {
    _ = method()
}

その関数の性質(戻り値に興味がない,など)によっては省略したくなる場合がある。
その場合,関数宣言の先頭に @discardableResult を付与すればよい。

@discardableResult
func method() -> Bool {
    return doSomething()
}

これで警告が出なくなる。

@discardableResult func method() -> Bool {
    return doSomething()
}

同じ行に書いてもOK。

参照渡し

inout をつけると,呼び出し先での実行結果が呼び出し元にも及ぶようになる。
以下は,受け取った text を繰り返して text に戻す関数の実装例。

func repeatString(text: inout String) {
    text = text + text
}

コールするときは引数の前に & をつける。

var text: String = "Hoge"
repeatString(text: &text)
print(text)

実行結果。

HogeHoge

入力の "Hoge" が繰り返されて "HogeHoge" となっている。

考え方は C のポインタ渡し,C++ の参照渡しに近いかも。


参考:
[Swift] 関数の返り値を使わない時は – su- tech blog