对于函数和运算符,Swift中的重载决策有哪些规则?

jon*_*onr 7 swift

在给定的调用站点给定一组重载的情况下,Swift 2.1编译器如何确定调用哪个方法或运算符?

这个问题可能会混淆两个问题:方法重载和运算符重载,但至少表面上看它们是相关的.不知何故,他们最终会使用不同的规则,我将很快演示.

class A{
}

class B: A {
}

func +(a:A, b:A){
  print("+1")
}

func +(a:A, b:B){
  print("+2")
}

func +(a:B, b:A){
  print("+3")
}

/*
func +(a:B, b:B){
  print("+4")
}
*/

A() + A() // prints +1
A() + B() // prints +1
B() + A() // prints +1
// B() + B() // will come back to this

func f(a: A, b: A){
  print("f1")
}

func f(a: B, b: A){
  print("f2")
}

func f(a: A, b: B){
  print("f3")
}

/*
func f(a: B, b: B){
  print("f4")
}
*/

f(A(), b: A()) // prints f1
f(B(), b: A()) // prints f2
f(A(), b: B()) // prints f3
// f(B(), b: B()) // will come back to this
Run Code Online (Sandbox Code Playgroud)

各种调用的输出都有f()意义.似乎Swift使用类似于Java的重载解析规则,其中给定一组方法选择"最具体的方法",其参数是同一类层次结构的一部分.

给定代码按原样,运算符重载的输出似乎都调用了第一个定义的运算符.定义的顺序无关紧要,如果+(A, A)放在最后,它仍然会被+的所有三次调用调用.这对我来说已经没有意义了.为什么没有+(A, B)要求表达A() + B()

当函数+(B, B)未注释时会发生奇怪的事情.突然之间,重载的工作方式就像在常规函数定义情况下一样.

完整的代码是:

func +(a:A, b:A){
  print("+1")
}

func +(a:A, b:B){
  print("+2")
}

func +(a:B, b:A){
  print("+3")
}

func +(a:B, b:B){
  print("+4")
}

A() + A() // prints +1
A() + B() // prints +2
B() + A() // prints +3
B() + B() // prints +4
Run Code Online (Sandbox Code Playgroud)

没有+(B, B)表达式的定义B() + B()是一个错误,因为它是否含糊不清是否选择+(A, B)+(B, A).我对这种行为很好.但是,为什么A()+B()B()+A()突然参考+2,并+3分别运营商?

常规功能案例不会以这种方式运行.给定的3个未注释defintions f如上作为预期的输出,f1,f2,f3为了.当f(B, B)取消注释定义时,表达式f(B(), B())按预期工作并打印f4.其他表达不受影响.