2015-10-09 142 views
3

是否有可能重載協議函數並在直接處理協議類型時調用正確的定義?Swift協議功能重載

下面是一些代碼來說明問題

protocol SomeProtocol { 
    func doSomething<T>(obj: T) 
} 

class SomeClass : SomeProtocol { 
    func doSomething<T>(obj: T) { 
     print("Generic Method") 
    } 
    func doSomething(obj: String) { 
     print(obj) 
    } 
} 

let testClass = SomeClass() 

testClass.doSomething("I will use the string specific method") 
(testClass as SomeProtocol).doSomething("But I will use the generic method") 

編輯:爲了澄清,代碼工作。我想知道爲什麼這兩個調用不使用特定於字符串的方法。

雙編輯:刪除一個簡單的例子

這是一個錯誤,電流限制,或預期的功能中介派遣類?如果這是有意的,有人可以解釋爲什麼嗎?

雨燕2.0的Xcode 7.0

回答

不能超載協議功能,並期望正確的定義被調用。這是因爲要調用的定義是在編譯時挑選的。由於編譯器不知道具體類型,因此它選擇編譯時已知的唯一定義,即doSomething<T>

+0

我在操場RUND這個代碼,它工作得很好:*我會用具體方法\ n一般方法* – vikingosegundo

+0

該代碼有效。我很困惑爲什麼這兩個調用不使用特定的方法。 – eunoia

+0

這兩種方法都使用 – vikingosegundo

回答

1

我在這裏測試了你的代碼http://swiftstub.com/,它工作正常。 首先它打印「我會用具體的方法」,然後選擇「通用方法」:

我會使用特定的methodGeneric方法

+0

這就是我所困惑的。爲什麼他們都不使用特定的方法? – eunoia

+0

我認爲這是因爲dispatcher.dispatch方法(testClass,obj:「但我將使用泛型方法」)接收泛型作爲參數,並將其作爲泛型傳遞給方法doSomething (obj:T) 也許編譯器中的某些東西首先檢查參數是否是泛型的,然後決定調用哪個方法。在這種情況下,testClass.doSomething(「我將使用特定的方法」) 的參數是直接字符串 ,在這種情況下,dispatcher.dispatch(testClass,obj:「但我會使用泛型方法」)也是一個字符串,但作爲通用類型傳遞 – Chuy47

+0

這是有道理的。本質上,Dispatch類的通用中介阻止編譯器正確推斷字符串類型。 那麼這是否意味着我想要做的事情是不可能的?或者(未來的)更新的編譯器理論上可以推斷出正確的類型? – eunoia