[Swift]関数の返り値を使わない時は

Saturday, September 24, 2016

Swift 3が正式にリリースされてからもう2週間くらい経って、少しずつSwift 3を紐解けてきている感があります。お久しぶりです。

最近は自分で作成していたOSSのSwift 3対応を進めているので、気づいたこととかあったらぼちぼち書き溜めていこうと思います。
今回は「デフォルトで関数の返り値を使わない時に警告がでるようになった」について書いていきます。

デフォルトで関数の返り値を使わない時に警告がでるようになった

どうやらSwift3からは、デフォルトの挙動として返り値のある関数を使用した時に、
その返り値を使わない場合に警告がでるようになりました。

func addTwo(_ num: Int) -> Int {
    return num + 2
}

// 警告がでる
addTwo(2) // Result of call to `addTwo` is unused.

// 戻り値を変数にいれる或いはワイルドカードに捨てれば出なくなる
_ = addTwo(3)

もし、返り値を使わないことを許可する場合は、 @discardableResult アノテーションを付けてあげます。

// @discardableResult をつけてあげる。関数の1行上でもいいし、同じ行の先頭でもok

@discardableResult
func addTwo(_ num: Int) -> Int {
    return num + 2
}

// 警告がでなくなる
addTwo(3)

ちなみに、Swift2まではこれらの動作と逆で、「返り値を使わない時に警告を出して欲しい」時に、
関数に @warn_unused_result アノテーションを付けていました。

// これはSwift2のコードです

// @warn_unused_result を付けることで、最初に紹介した例と同じ挙動をします。
@warn_unused_result
func addTwo(num: Int) -> Int {
    return num + 2
}

// 警告がでる
addTwo(3)

使い所は?

じゃあ使い所はどんな時になるの?ということですが、例えば以下のように関数で行った動作が成功したか失敗したかを、
Bool値として返却する場合には、 @discardableResult を付けておくほうがうるさくなくて良いと思います。

@discardableResult
func doSomething() -> Bool {
    // 何かしらの動作をする
    if somethingWrong {
        return false
    }
    return true
}

doSomething()

身近な例を出すと、Arrayのremove(at:)なんかは、この @discardableResult がついています。
(Xcode上からコード辿ると @discardableResult がついていないように見えますが、ちゃんとついています。)
参考: ArrayType.swift

他にも、FileManagerの操作系(move,copy,removeとか)の関数の返り値もBoolですが、警告がでないようになっているかと思います。

小さい変化だけど

こういう細かい所にも配慮してコーディングできるようになるといいなって思いました。自分も気をつけていきます。

参考

techSwiftSwift3.0iOS

【Swift】一度だけ処理を実行したい!を叶えるclosure

気づけば8月