不支持将某些协议用作符合其他协议的具体类型

不支持将某些协议用作符合其他协议的具体类型,第1张

不支持将某些协议用作符合其他协议的具体类型

该限制的根本原因是Swift没有一流的元
类型。最简单的例子是,这不起作用:

func isEmpty(xs: Array) -> Bool {    return xs.count == 0}

从理论上讲,此代码可以工作,如果可以,
我可以创建很多其他类型的代码(例如Functor和Monad,
今天在Swift中实际上还无法表达它们)。但是你不能。您需要帮助Swift将其固定为
具体类型。通常,我们使用泛型来做到这一点:

func isEmpty<T>(xs: [T]) -> Bool {    return xs.count == 0}

注意,T这里完全多余。我没有理由要
表达它。它从未使用过。但是Swift需要它,因此它可以将摘要
Array变成具体的[T]。您的情况也是如此。

这是一个具体类型(嗯,它是一个抽象类型,在
实例化并P填充时会变成具体类型):

class ImplementProtocolA<P : ProtocolA>

This is a fully abstract type that Swift doesn’t have any rule to turn into a
concrete type:

class ImplementProtocolB : ImplementProtocolA<ProtocolB>

You need to make it concrete. This will compile:

class ImplementProtocolB<T: ProtocolB> : ImplementProtocolA<T> {}

And also:

class UserDemoPresenter<T: GetUserView> : Presenter {    typealias V = T}

只是因为您以后可能会遇到此问题:如果您要创建这些结构或final类,您的生活就会轻松得多。混合协议,泛型和类多态性充满了非常尖锐的边缘。有时您很幸运,而且它无法编译。有时它会发出您
意想不到的事情。

您可能对一点尊重
任何序列感兴趣,该序列详细介绍了一些相关问题。


private var presenter : UserDemoPresenter<GetUserView>

This is still an abstract type. You mean:

final class Something<T: GetUserView> {    private var presenter: UserDemoPresenter<T>}

如果这样会产生问题,则需要创建一个框。看到协议不符合自身?讨论如何进行类型擦除,以便
保留抽象类型。但是您需要处理具体类型。您最终不能专注于协议。在大多数情况下,您最终必须专注于具体的事情。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5171622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存