在Swift中,函数重载是合法的,也是常见的。这意味着具有相同函数名(包括外部参数名)的两个函数可以共存,只要签名不同即可。
比如,如下两个函数可以共存:
func say (what:String) {}func say (what:Int) {}
重载可行的原因在于Swift拥有严格的类型。String一定不是Int。Swift能够在声明中将二者区分开,在函数调用时也能区分开。这样,Swift就能够毫无歧义地知道say("what")不同于say(1)。
重载也适用于返回类型。具有相同名字与相同参数类型的两个函数可以有不同的返回类型。不过调用上下文一定不能有歧义;也就是说,一定要清楚调用者需要什么样的返回类型。
比如,如下两个函数可以共存:
func say -> String { return "one"}func say -> Int { return 1}
但现在就不能像下面这样调用了:
let result = say // compile error
上述调用是有歧义的,编译器会告诉你这一点。调用上下文一定要清楚期望的返回类型是什么。比如,假设我们有另一个没有重载的函数,它接收一个String参数:
func giveMeAString(s:String) { print("thanks!")}
那么giveMeAString(say())就是合法的,因为只有一个String符合,因此我们必须调用返回String的say。与之类似:
let result = say + "two"
只有String可以“加到”String上,因此这个say()必须是个String。
如果之前用过Objective-C,那么你会对Swift中重载的合法性感到惊讶,因为在Objective-C中是不允许重载的。如果在Objective-C中声明了相同方法的两个重载版本,那么编译器就会报“Duplicate declaration”错误。实际上,如果在Swift中声明了两个重载方法,但Objective-C却能看到它们(参见附录A了解详情),那么就会遇到一个Swift编译错误,因为这种重载与Objective-C是不兼容的。
具有相同签名和不同外部参数名的两个函数并不构成重载;由于函数有着不同的外部参数名,因此它们是名字不同的两个不同函数。