2016-04-13 23 views
0

Bu işlevi genel bir türe dönüştürmeyi nasıl seçerim?Bu işlevi genel bir türe nasıl dönüştürebilirim?

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

    return concatenated 
} 
+0

Neden istiyorsun? Amacın ne? – jtbandes

+0

Çü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

+0

Hem String hem de Int için + işlevini destekleyen yerleşik bir protokol yok. Kendini tanımlamak zorundasın. – jtbandes

cevap

1

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

Harika bir açıklama için teşekkürler! Bu cevabı kabul ettim. – SteveSmith

İlgili konular