2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftでA==B==Cのような比較を可能にする

Last updated at Posted at 2019-08-01

3項以上のオブジェクトが等しいことを調べる演算子を作りました.

 A == B &== C &== D //AとB,C,Dが等しいならTrueが返る

概要

Swiftをはじめ,多くの言語では以下(1)のように二項の比較しかできず.A==B==Cのように同時に3項目以上が等しいことを示すことはできません.そのため,通常は(2)のように書きます.

if A == B {} //(1)
if A == B && B == C {} //(2)

しかし,この書き方ではBを二回書く必要がある上,論理和を取ることになるので「全てが等しい」というイメージが伝わりにくくなります.

そこで,カスタム演算子を追加し,代わりに以下のような表記(3)(4)を可能にしました.

if A == B &== C {} //(3)
if A == B &== C &== D {} //(4)

#使用方法
下記のサンプルコードはPlaygroundでの動作を確認しています.ここで定義している&==演算子を使用すると3項以上の値が等しいかどうか調べられます.使用するときには1項と2項の間に==を使用し,それ以降の比較には&==を使用してください.

#ディスカッション

以下のような検討事項があるのでご意見いただけますと幸いです.

  • このような書き方に需要はあるのか
  • この書き方に何かしらの(文法上等)問題はないか
  • 全て同じ演算子を使うようにできないか(現状2種類使い分ける必要がある)

#サンプルコード

import Foundation

precedencegroup ConsecutiveComparison {
    higherThan: ComparisonPrecedence //演算子の優先順序
    associativity: right //右結合
}

infix operator &==: ConsecutiveComparison //新しいカスタム演算子の定義

public func ==<T: Equatable>(lhs:T , rhs: Array<T>) -> Bool {
    for r in rhs {
        if r != lhs {return false}
    }
    return true
}

public func &==<T: Equatable>(lhs:T , rhs: Array<T>) -> Array<T> {
    var r = rhs
    r.append(lhs)
    return r
}

public func &==<T: Equatable>(lhs:T , rhs: T) -> Array<T> {
    return [lhs,rhs]
}

//以下動作テスト

let a1 = "a"
let a2 = "a"
let a3 = "a"
let a4 = "a"
let c = "c"

print(a1 == a2 &== c) //false
print(a1 == a2 &== a3) //true
print(a1 == a2 &== a3 &== a4) //true
print(a1 == a2 &== a3 &== c) //false
print(a1 == a2 &== c &== a3) //false
print(a1 == c) //false
print(a1 == a2) //true
2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?