我必须将接口作为参数传递给函数。接口是通用的,也称为具有关联的类型。我找不到一个好的方法来做到这一点。这是我的代码:
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 语言的新手,但完成事情的方式太复杂且用户不友好......或者我太愚蠢了:)
如果你使用typealias
在协议中使其类似于泛型,那么在解析关联类型之前,您不能将其用作变量类型。正如您可能经历过的那样,使用具有关联类型的协议来定义变量(或函数参数)会导致编译错误:
协议“MyProtocol”只能用作通用约束,因为它具有与 Self os 相关的类型要求
这意味着您不能将其用作具体类型。
因此,我知道使用具有关联类型的协议作为具体类型的唯一两种方法是:
- 间接地,通过创建一个实现它的类。可能不是你计划做的
- 像您在 func 中所做的那样显式关联类型
另请参阅相关答案https://stackoverflow.com/a/26271483/148357 https://stackoverflow.com/a/26271483/148357
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)