Swift 2.2で可能になったタプルの比較を試してみる

公開日: : 最終更新日:2016/04/17 iPhoneアプリ開発

20160416-142928.jpg

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冊です。

    

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

20141225-223049.jpg

【Xcode6】Auto Layoutで制約のFirst ItemとSecond Itemを逆にする方法

一度追加した制約のFirst ItemとSecond Itemを入れ替える方法について紹介します

記事を読む

20160309-131202.jpg

ゆるい入門書では物足りない人向けの濃い内容!「本気ではじめるiPhoneアプリ作り」

ヤフー株式会社のiOSエンジニアである西 磨翁(にし まお)さんより、「本気ではじめるiPhon

記事を読む

20160804-193842.jpg

【Xcode 7】Storyboardで複数の制約をまとめて追加する方法

Xcode 7のStoryboardで、複数の制約をまとめて追加する方法について解説します!

記事を読む

I20160513-010707.jpg

Swiftで計算型プロパティをネストさせてみる

Swiftの計算型プロパティ(Computed property、コンピューテッドプロパティ)を

記事を読む

20140905-180905.jpg

英語苦手な人がSwiftを学びたいならこの本を読むといいよ!

アップルのWWDC2014で発表された、iOSおよびOS Xのためのプログラミング言語「Swift」

記事を読む

I20160208-152320.jpg

【Swift】privateなタイプメソッド作るなら、privateな関数でも良いかもと思った

structとかclassの中で、ちょっとした処理を担当させるprivateなタイプ

記事を読む

iPhoneアプリ開発の初心者にオススメな本はこれだ!iOS 7とXcode 5に対応!

僕が講師をしている初心者向けのiPhoneアプリ開発講座「アプリクリエイター道場」でも参考書とし

記事を読む

20160724-154909.jpg

デザインの素人がノンデザイナーズ・デザインブックを読んだら、デザインの原則が結構分かるようになった!

ずっとエンジニアとして働いてきてデザインに関してはまったくの素人な僕ですが、「ノンデザイナーズ・

記事を読む

I20160417-171311.jpg

Xcodeのブレークポイントで変数の中身を通知センターに表示してみる

Xcodeのブレークポイントの機能を使って、ブレークポイントを通過した時点での変数の中身を通知セ

記事を読む

I20160210-140020.jpg

【Xcode】モーダル表示で遷移先へ値を渡す時のハマりポイント

モーダル表示で遷移先の画面へ値を渡す際、最初はハマりやすいポイントについて解説したいと思いま

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑