我正在快速阅读advanced operators。
基本功能:
func add(a: Unicorn, b: Unicorn) -> Unicorn { return a + b }
add(u1, u2) // two unicorns are added
中缀运营商:
func + (a: Unicorn, b: Unicorn) -> Unicorn { return a + b }
c = u1 + u2
后缀:
postfix func + (a: Unicorn) -> Unicorn { return a + 2 } // nonsense example
u1+
我不明白infix
如何被认为是默认值。从正常的函数声明来看,它看起来并没有什么不同。
这里的规则是什么 - 任何单个字符是中缀操作的合法名称?这是否意味着单个字符函数不被允许?可以在swift中将任何双参数函数称为中缀样式吗?
答案 0 :(得分:6)
我不明白中缀如何被认为是默认值。
如果使用两个参数实现一个运算符,编译器可以确定你需要一个中缀运算符,因为只有中缀运算符可以运行两个值。
如果使用一个值实现运算符,编译器不确定它是前缀还是后缀运算符,并会抱怨。
中缀运算符采用两个值,后缀和前缀只有一个。
这是否意味着不允许单个字符功能? swift中的任何双参数函数都可以称为中缀样式吗?
没有。以任何这些字符开头的函数是运算符:/,=, - ,+,!,*,%,<,>,&,|,^,?或〜 1 。运算符也可以包含多个字符,但必须以其中一个字符开头。
请记住,必须首先声明一个新运算符,例如:
prefix operator / {}
prefix func / (a: Int) -> Int {
return a / 42
}
/56
然而,这个声明不起作用,因为a
不是运营商必须开始的字符之一:
prefix operator a {}
1 实际上有更多的角色。阅读here。
答案 1 :(得分:1)
不,并非所有单个字符都可以作为中缀运算符。一般来说,规则是标识符(变量,方法名称等)中允许的字符和运算符中允许的字符不一样。
例如,运算符中允许的字符指定为here
更具体地说,令牌中的第一个字符是决定性的字符。
答案 2 :(得分:0)
如果我的问题得到了解答,我认为答案是:您正在超载现有运营商。
假设我们要使用自定义运算符,我需要声明前缀/ infix / postfix
编辑: 在互联网上找到了一个更好的例子:
像:
infix operator **= { associativity right precedence 90 }
func **= (inout left: Double, right: Double) {
left = left ** right
}