I keep seeing Swift classes where two methods are defined that only differ in return type. I'm not used to working in languages where this is allowed (Java, C#, etc), so I went looking for the documentation that describes how this works in Swift. I've found absolutely nothing anywhere. I would have expected an entire section on it in the Swift book. Where is this documented?
Here is an example of what I'm talking about (I'm using Swift 2, FWIW):
class MyClass {
subscript(key: Int) -> Int {
return 1
}
subscript(key: Int) -> String {
return "hi"
}
func getSomething() -> Int {
return 2
}
func getSomething() -> String {
return "hey"
}
}
Test:
let obj = MyClass()
//let x = obj[99]
// Doesn't compile: "Multiple candidates fail to match based on result type"
let result1: String = obj[123]
print("result1 \(result1)") // prints "result1 hi"
let result2: Int = obj[123]
print("result2 \(result2)") // prints "result2 1"
//let x = obj.getSomething()
// Doesn't compile: "Ambiguous use of 'getSomething'"
let result3: String = obj.getSomething()
print("result3 \(result3)") // prints "result3 hey"
let result4: Int = obj.getSomething()
print("result4 \(result4)") // prints "result4 2"
Method overloading cannot be done by changing the return type of methods. The most important rule of method overloading is that two overloaded methods must have different parameters.
The compiler does not consider the return type while differentiating the overloaded method. But you cannot declare two methods with the same signature and different return types. It will throw a compile-time error. If both methods have the same parameter types, but different return types, then it is not possible.
In method overriding, methods must have the same name and same signature. In method overloading, the return type can or can not be the same, but we just have to change the parameter.
Q) Why Method Overloading is not possible by changing the return type of method only? In java, method overloading is not possible by changing the return type of the method only because of ambiguity.
Where is this documented?
As for subscript
:
Language Reference / Declarations / Subscript Declaration
You can overload a subscript declaration in the type in which it is declared, as long as the parameters or the return type differ from the one you’re overloading.
Language Guide / Subscripts / Subscript Options
A class or structure can provide as many subscript implementations as it needs, and the appropriate subscript to be used will be inferred based on the types of the value or values that are contained within the subscript braces at the point that the subscript is used.
I cannot find any official docs about overloading methods or functions. but in the Swift Blog:
Redefining Everything with the Swift REPL / Redefinition or Overload?
Keep in mind that Swift allows function overloading even when two signatures differ only in their return type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With