如何在Swift中传递具有关联类型(通用协议)的协议作为参数?

时间:2014-10-12 15:00:26

标签: swift generics

我必须将接口作为参数传递给函数。接口是通用的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语言的新手,但事情的完成方式太复杂,用户不友好......或者我太傻了。)

1 个答案:

答案 0 :(得分:6)

如果在协议中使用typealias使其类似于通用,则在解析关联类型之前,不能将其用作变量类型。您可能已经遇到过,使用具有关联类型的协议来定义变量(或函数参数)会导致编译错误:

  

协议'MyProtocol'只能用作通用约束,因为它具有Self os关联类型要求

这意味着你不能将它用作具体类型。

因此,我知道使用具有关联类型的协议作为具体类型的唯一两种方法是:

  • 间接地,通过创建实现它的类。可能不是你计划做的事情
  • 明确显示与您在func
  • 中所做的关联类型

另见相关答案https://stackoverflow.com/a/26271483/148357