[WWDC18] Swift 4.2でSequenceに追加されたallSatisfyメソッドのご紹介 #WWDC18

Swift 4.2でSequenceに追加されたallSatisfyメソッドをご紹介します。
2018.06.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

はじめに

WWDC18のセッション、「What’s New in Swift」の中で、Swift 4.2で実装されたproposalの話が出てきました。今回はSwift 4.2でSequenceに追加されたallSatisfyメソッドをご紹介します。

検証環境

  • macOS High Sierra 10.13.4
  • Xcode Version 10.0 beta (10L176w)

シーケンスの全ての要素が条件を満たすかどうかを取得したい

Arrayなどのシーケンスで、「全ての要素が条件を満たすかどうか」を取得したい場合があります。

ここでは以下のようなIntのArrayがあり、「全ての要素が偶数かどうか」を取得したいとします。

let values = [2, 4, 6, 8]

これまで

これまではcontainsメソッドを使って条件を指定することで実現していました。 例えば、

let allElementsAreEven = !values.contains { !($0 % 2 == 0) }

let allElementsAreEven = !values.contains { $0 % 2 == 1 }

などの方法です。

Swift 4.2から

従来のcontainsを使った方法では!(否定)を使わざるを得ないため、可読性がよくありませんし、バグを生みやすい書き方でもあります。(特に否定が複数出てくるパターン...)

そこでSwift 4.2ではSequenceに新しくallSatisfyメソッドが追加されました。 このメソッドを使うと以下のように書くことができます。

let allElementsAreEven = values.allSatisfy { $0 % 2 == 0 }

!(否定)が無くなり一目で何をやっているかわかるようになりましたね! これまでなかったのが不思議なくらいです。

ちなみにallSatisfyメソッドのシグネチャは以下となっています。

func allSatisfy(_ predicate: (Self.Element) throws -> Bool) rethrows -> Bool

おわりに

今回はSwift 4.2でSequenceに追加されたallSatisfyメソッドをご紹介しました。 「全ての要素が条件を満たすかどうか」を取得する場合はこのメソッドを使用するようにしましょう。

参考

Add an allSatisfy algorithm to Sequence SE-0207