Bu işlem değil eser:
func addThreeValues<T>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
derleyici T
s ile çalışan herhangi +
operatör bilmediği Çünkü
.
Uygun bir +
işleci bulabilmesi için jenerik parametresini kullanmanız gerekir. IntegerType protocol birisini sağlamaktadır Ancak
func addThreeValues<T: IntegerType>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
, dize IntegerType protokolüne uymadığı:
addThreeValues("a", "b", "c") // error: cannot invoke 'addThreeValues' with an argument list of type '(String, String, String)'
Bu sorunu gidermek için kendi protokolünü tanımlamak ve istediğiniz hangisi türleri için uygunsuzlukları için sağlayabilir kullanın:
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
}
Şimdi bu işleri:
addThreeValues(1, 2, 3) // returns 6
addThreeValues("a", "b", "c") // returns "abc"
Neden istiyorsun? Amacın ne? – jtbandes
Çünkü aynı şeyi yapan iki farklı işleve sahibim. Biri dizeleri birbirine ekliyor ve diğer tam sayıları. Artı nasıl yapılacağını öğrenmek istiyorum. Teşekkürler – SteveSmith
Hem String hem de Int için + işlevini destekleyen yerleşik bir protokol yok. Kendini tanımlamak zorundasın. – jtbandes