在给定的调用站点给定一组重载的情况下,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.其他表达不受影响.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |