Ich sehe immer Swift-Klassen, in denen zwei Methoden definiert sind, die sich nur im Rückgabetyp unterscheiden. Ich bin es nicht gewohnt, in Sprachen zu arbeiten, in denen dies erlaubt ist (Java, C#, usw.), also suchte ich nach der Dokumentation, die beschreibt, wie dies in Swift funktioniert. Ich habe absolut nichts gefunden. Ich hätte im Swift-Buch einen ganzen Abschnitt darüber erwartet. Wo ist das dokumentiert? HierSwift: Methodenüberladungen, die sich nur im Rückgabetyp unterscheiden
ist ein Beispiel dafür, was ich rede (Ich verwende 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"
Ich denke, dass Ihre Demo dort Dinge ziemlich gut erklärt. Wenn der Compiler bestimmen kann, welche Funktion zu verwenden ist, ist es erlaubt. Dies umfasst nicht nur den Namen der Funktion, sondern auch Namen und Typen von Argumenten sowie den Rückgabetyp. Funktionen mit unterschiedlichen Signaturen zählen als unterschiedliche Funktionen. – Eric