Swift 2.2で可能になったタプルの比較を試してみる
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
Swift 2.2でタプルの比較が行えるようになったので、色々と試してみました。
要素数2個から6個までのタプルの比較
まずは要素数2個から6個までのタプルの比較を試してみました。
(1,2) == (1,2) // true (1,2,3) == (1,2,3) // true (1,2,3,4) == (1,2,3,4) // true (1,2,3,4,5) == (1,2,3,4,5) // true (1,2,3,4,5,6) == (1,2,3,4,5,6) // true
タプルの==演算子の宣言を確認してみましょう。
@warn_unused_result public func == <A : Equatable, B : Equatable> (lhs: (A, B), rhs: (A, B)) -> Bool @warn_unused_result public func == <A : Equatable, B : Equatable, C : Equatable> (lhs: (A, B, C), rhs: (A, B, C)) -> Bool @warn_unused_result public func == <A : Equatable, B : Equatable, C : Equatable, D : Equatable> (lhs: (A, B, C, D), rhs: (A, B, C, D)) -> Bool @warn_unused_result public func == <A : Equatable, B : Equatable, C : Equatable, D : Equatable, E : Equatable> (lhs: (A, B, C, D, E), rhs: (A, B, C, D, E)) -> Bool @warn_unused_result public func == <A : Equatable, B : Equatable, C : Equatable, D : Equatable, E : Equatable, F : Equatable> (lhs: (A, B, C, D, E, F), rhs: (A, B, C, D, E, F)) -> Bool
Equatableプロトコルに適合している型で構成されているタプルのみ比較できることが分かります。
試しに、Equatableプロトコルに適合していない型で構成されたタプル同士を==演算子で比較するとエラーとなりますが、
struct NotEquatableType { var num: Int } let l1 = NotEquatableType(num: 1) let l2 = NotEquatableType(num: 2) let r1 = NotEquatableType(num: 1) let r2 = NotEquatableType(num: 2) // error: binary operator '==' cannot be applied // to two '(NotEquatableType, NotEquatableType)' operands (l1, l2) == (r1, r2)
Equatableプロトコルに適合している型で構成されたタプル同士は、==演算子で比較することができます。
struct EquatableType: Equatable { var num: Int } func ==(lhs:EquatableType, rhs:EquatableType) -> Bool { return lhs.num == rhs.num } let l1 = EquatableType(num: 1) let l2 = EquatableType(num: 2) let r1 = EquatableType(num: 1) let r2 = EquatableType(num: 2) (l1, l2) == (r1, r2) // true
要素数1個のタプルの比較
要素数1個のタプル同士を==演算子で比較してみましょう。
(1) == (1) // true
この時、単なるInt同士を比較する以下のような==演算子が使われます。
public func ==(lhs: Int, rhs: Int) -> Bool
要素数が1個のタプルは、要素そのものの型として扱われるようです。
let n: Int = (1) // Intが1つのタプルは、単なるIntとして扱える
要素数が7個以上のタプルの比較
要素数が7個以上のタプル同士を比較する==演算子は用意されていないので、エラーとなります。
// error: binary operator '==' cannot be applied // to two '(Int, Int, Int, Int, Int, Int, Int)' operands (1,2,3,4,5,6,7) == (1,2,3,4,5,6,7)
必要であれば以下のように自ら定義する必要があります。
func ==<A : Equatable, B : Equatable, C : Equatable, D : Equatable, E : Equatable, F : Equatable, G : Equatable> (lhs: (A, B, C, D, E, F, G), rhs: (A, B, C, D, E, F, G)) -> Bool { return lhs.0 == rhs.0 && lhs.1 == rhs.1 && lhs.2 == rhs.2 && lhs.3 == rhs.3 && lhs.4 == rhs.4 && lhs.5 == rhs.5 && lhs.6 == rhs.6 } (1,2,3,4,5,6,7) == (1,2,3,4,5,6,7) // true
@akio0911はこう思った。
タプルの==演算子が標準で用意されていなかったことは、Swiftに対する不満の一つだったので嬉しいです。
これで、タプルをXCTestのXCTAssertEqualなどにも渡せるようになりました。XCTAssertなどにタプルの比較結果を渡しやすくなりました( XCTAssert( (1,2) == (1,2) ) )。
↓ Swiftの文法について学びたいなら持っておきたい1冊です。
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!