我必须将接口作为参数传递给函数。接口是通用的a.k.a.具有关联类型。我找不到一个很好的方法来做到这一点。这是我的代码:
protocol IObserver : class {
typealias DelegateT
...
}
class Observer: IObserver {
typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol
...
}
func notify(observer: IObserver) { ... } // here I need a type for observer param
我发现这样可行:
func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... }
,但是来得太复杂了。如果我想在类变量中保存这个参数,如果我将整个类设为泛型,只是因为这个函数。
我确实是C ++开发人员,而且我是Swift语言的新手,但事情的完成方式太复杂,用户不友好......或者我太傻了。)
答案 0 :(得分:6)
如果在协议中使用typealias
使其类似于通用,则在解析关联类型之前,不能将其用作变量类型。您可能已经遇到过,使用具有关联类型的协议来定义变量(或函数参数)会导致编译错误:
协议'MyProtocol'只能用作通用约束,因为它具有Self os关联类型要求
这意味着你不能将它用作具体类型。
因此,我知道使用具有关联类型的协议作为具体类型的唯一两种方法是: