👍

Swift:配列の中の要素に対して全て条件を満たしているかを返す - allSatisfy

2021/02/24に公開

配列の中の要素全てが特定の条件を満たしているかを確認したいというとき、ありますよね。
例えば、Int型の配列があり、中身が全て偶数かどうか確認したい。

let numbers = [2, 4, 6, 8, 10]

これまでは以下のようにforEachなどを利用して全ての要素をチェックする必要がありました。

let numbers = [2, 4, 6, 8, 10]
var isAllEven = true

numbers.forEach { number in
    if number % 2 != 0 {
        isAllEven = false
    }
}

if isAllEven {
    print("全て偶数です")
} else {
    print("奇数が混ざっています")
}
// 全て偶数です

もっと簡単な確認方法はないものかと調べていたら、allSatisfyというメソッドがあるようでした。

@inlinable public func allSatisfy(_ predicate: (Element) throws -> Bool) rethrows -> Bool
https://developer.apple.com/documentation/swift/array/2994715-allsatisfy

allSatisfyを使った場合、上記と同じ偶数チェックはこのように書くことができます。

let numbers = [2, 4, 6, 8, 10]
if numbers.allSatisfy({ $0 % 2 == 0 }) {
    print("全て偶数です")
} else {
    print("奇数が混ざっています")
}
// 全て偶数です

要素全てに対して同じ条件文を適用、比較をするのであれば、非常に便利ですね。

Appleのドキュメントにはこんなサンプル文も載っていました。

let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
let allHaveAtLeastFive = names.allSatisfy({ $0.count >= 5 })
// allHaveAtLeastFive == true

上記のように配列の中身が全て○文字以上かどうかをチェックすることもallSatisfyを使えば簡単にできますね。

Discussion