日記
焼肉行きてぇ
今日書いたコード
infix operator **: MechakuchaTsuyoiPrecedence precedencegroup MechakuchaTsuyoiPrecedence { higherThan: MultiplicationPrecedence associativity: left } import Foundation extension Int { static func ** (left: Int, right: Int) -> Int { Int(pow(Double(left), Double(right))) } } print(4 ** 8 * 2, "=", Int(pow(4.0, 8.0)) * 2, "≠", Int(pow(4.0, 8.0 * 2.0))) // 131072 = 131072 ≠ 4294967296
感想
昨日の節はOperator Methodというタイトルで,既存の演算子の挙動を定義できるという話だった.昨日の例のように独自の演算子を定義するのは今日のCustom Operatorの範疇だった. 訂正しました(2021/09/22)precedencegroup
を指定しないなら昨日のように手数が少なく書けるということらしい.
ということで上記のようなコードが書ける.Precedenceというのは演算子の優先度で,例えば乗算は加算よりPrecedenceが高い.Associativityは同じPrecedenceの演算子が並んだときどちらから演算が行われるかを表すもので,例えば乗算は左向きのAssociativityを持つ.
上記以外に指定できる項目はPrecedence Group Declaration
を参照.既存の演算子が属するprecedencegroup
の一覧はOperator Declarations.