Swift - 创建 post- 和前缀运算符?

Swift - Create post- and prefix operator?

在数学中,通常将数字 x 的量写为 |x|。我想对我的代码采用类似的方法。我对此的尝试如下所示:

prefix operator |
postfix operator |

extension Int {
    lazy var absolute = false
    static prefix func | (right: Int) -> Int {
        assert(right.absolute, "Missed closing absolute value bar.")
        right.absolute = false
        if right < 0 {
            return -value
        }
        return value
    }
    static postfix func | (left: Int) -> Int {
        assert(!left.absolute, "Missed opening absolute value bar.")
        left.absolute = true
        return left
    }
}

(我认为这段代码不会编译,因为据我所知你不能在扩展中添加存储的属性。它只是为了演示我的尝试。我将这个功能添加到我的自定义类型中。)

尽管这对我来说是一个相当糟糕的解决方案,但这段代码的另一个问题是,如果我忘记了开始栏,它不会抛出任何错误。断言只会在我忘记前一个金额函数调用中的开仓柱后调用另一个金额函数时中断 运行 程序。

如果您有更好的解决方案,请告诉我! 谢谢

首先声明,我认为这不是个好主意。这比它的价值更麻烦。但是这里是:

prefix operator |
postfix operator |

prefix func | <T: Comparable & SignedNumeric>(f: () -> T) -> T {
    return f()
}

postfix func | <T: Comparable & SignedNumeric>(n: T) -> () -> T {
    return { abs(n) }
}


|42| // returns 42
|(-42)| // returns 42

想法是后缀运算符 returns 一个函数,然后用作前缀运算符的参数,然后 returns 最终结果。我最初有相反的方式(前缀运算符返回函数),但编译器不喜欢那样 - 似乎后缀运算符具有更高的优先级。

返回函数的好处是|42不编译(因为参数类型不匹配)而42|编译时,你会得到一个错误由于类型不匹配而在计算中使用它。

如果将它与文字一起使用,您仍然必须将负数括起来,因为 Swift 无法解析两个连续的前缀运算符。我也没有对此进行太多测试,可能还有其他无法编译的边缘情况。