2015-10-09 145 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