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