読者です 読者をやめる 読者になる 読者になる

面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

あると便利なextension"find"

Swiftで色々便利になったり、融通が効きやすくなったけど、
個々の状況では不便だな〜とか、こういうメソッドあったらいいのに〜と
思うことも多々ある。

そんな時はextensionして使い勝手良くしてしまえばいい。
現場で教えて貰ったextensionで便利だなーと思ったのがあったので書いておく。

"find"は、filterで条件絞って、その中から先頭を抜き出すのに少し手間がかかるので、
条件に合った先頭を最初から返すようにしたもの。

// Swift2
extension SequenceType {
    func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? {
        for element in self {
            if try predicate(element) {
                return element
            }
        }
        return nil
    }
}
// Swift3
extension Sequence {
    func find(predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.Iterator.Element? {
        for element in self {
            if try predicate(element) {
                return element
            }
        }
        return nil
    }
}

教えて貰ったコードが、Swift2だったのでそれをそのままと
主流がSwift3になりつつあるのでSwift3のコードも併せて記載。

// 使用例
let array = [1, 20, 321, 77, 900]

let extract1 = array.find { $0 >= 50 }
print(extract1) // "Optional(321)\n"

let extract2 = array.find { $0 >= 10 }
print(extract2) // "Optional(20)\n"