ぜのぜ

しりとりしようぜのぜのぜのぜ

99日目

日記

今月の食費がやばい

今日書いたコード

postfix operator +++
extension Int {
    static postfix func +++ (operand: Self) -> Self {
        operand + 2
    }
}

1 +++ 2 // '+++' is not a binary operator
1 +++2 // '+++' is not a prefix unary operator, Consecutive statements on a line must be separated by ';'
1+++ 2 // Consecutive statements on a line must be separated by ';'
1+++.description

感想

  1. 演算子の両側に空白があるときはバイナリ演算子として解釈される
  2. 演算子の左側にのみ空白があるときは単項prefix演算子として解釈される
  3. 演算子の右側にのみ空白があるときは単項postfix演算子として解釈される
  4. 演算子の両側に空白がないが,右側に.(U+002E)があるときは単項postfix演算子として解釈される

94日目の訂正

ところで,94日目に以下のように書いたがこれは間違いだった.

precedencegroupを指定しないなら昨日のように手数が少なく書けるということらしい.

precedencegroupを指定しない場合もoperatorの宣言は必要だった.

struct Some {}
extension Some {
    postfix static func ++ (e: Self) -> Self { e }
    prefix static func ++ (e: Self) -> Self { e }
    postfix static func -- (e: Self) -> Self { e }
    prefix static func -- (e: Self) -> Self { e }

    // Operator implementation without matching operator declaration
    postfix static func +++ (e: Self) -> Self { e }
    // Operator implementation without matching operator declaration
    prefix static func +++ (e: Self) -> Self { e }
    // Operator implementation without matching operator declaration
    postfix static func --- (e: Self) -> Self { e }
    // Operator implementation without matching operator declaration
    prefix static func --- (e: Self) -> Self { e }
}

pre/postfixの単項演算子++--の宣言が必要ないのは,Swift3以前はSwiftにもそれらがあったからではないかと思う.このproposalが採択されてSwift3以降消えたが宣言は残っている?