组合使用自定义运算符

Using custom operators in combination

假设我已经定义了一个前缀运算符 *,以及一个与之关联的函数:

prefix operator * { }
prefix func * (value: Int) -> Bool {
    return value == 5
}

函数 returns a Bool,所以很明显要做的事情就是用 ! 前缀运算符取反。
尝试这样做时,必须使用括号:

let myBool = !(*5)

有没有办法一起使用运算符:!*5
而不定义新的运算符:prefix operator !* { }

我会说这是不可能的。编译器将这 2 个运算符的组合视为单个运算符,无法识别。

甚至不可能在非运算符及其操作数之间添加 space,因为一元运算符必须是 "attached"。所以只剩下 2 个选项是您要避免的选项:

  1. 使用括号
  2. 定义一个新的 !* 运算符

请注意,即使编译器能够将它们解析为 2 个不同的运算符,也有可能无法正常工作。事实上,避免糖语法并将运算符用作普通函数,这是可行的:

let bool = (*)(5)
let not = (!)(bool)

但这不是:

(!)(*)(5)

虽然明确了优先级但它有效:

(!)((*)(5))