2016-04-13 19 views
0

Wie würde ich diese Funktion in einen generischen Typ umwandeln?Wie kann ich diese Funktion in einen generischen Typ umwandeln?

func addThreeValue(value1:String,value2:String,value3:String) -> String { 
    let concatenated = value1 + value2 + value3 

    return concatenated 
} 
+0

Warum willst du? Was ist dein Ziel? – jtbandes

+0

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

+0

Es gibt kein eingebautes Protokoll, das die Funktion + für String und Int unterstützt. Sie müssten Ihre eigenen definieren. – jtbandes

Antwort

1

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" 
+0

Danke für die tolle Erklärung! Ich habe diese Antwort akzeptiert. – SteveSmith

Verwandte Themen