Dies wird nicht Arbeit:
func addThreeValues<T>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
Da der Compiler nicht weiß, über jeden +
Operator, der mit T
s arbeitet.
Sie müssen den generischen Parameter beschränken, damit er einen geeigneten +
Operator finden kann. Die IntegerType protocol bietet ein:
func addThreeValues<T: IntegerType>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
jedoch String entspricht nicht dem IntegerType Protokoll:
addThreeValues("a", "b", "c") // error: cannot invoke 'addThreeValues' with an argument list of type '(String, String, String)'
Um dies zu umgehen können Sie Ihr eigenes Protokoll definieren und liefern Abweichungen für je nachdem, welche Arten Sie wollen Verwendung:
protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
}
extension String: Addable {}
extension Int: Addable {}
func addThreeValues<T: Addable>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
Jetzt funktioniert das:
addThreeValues(1, 2, 3) // returns 6
addThreeValues("a", "b", "c") // returns "abc"
Warum willst du? Was ist dein Ziel? – jtbandes
Weil ich zwei verschiedene Funktionen habe, die dasselbe tun. Einer fügt Strings zusammen und die anderen Ganzzahlen. Außerdem möchte ich lernen, wie es geht. Danke – SteveSmith
Es gibt kein eingebautes Protokoll, das die Funktion + für String und Int unterstützt. Sie müssten Ihre eigenen definieren. – jtbandes