栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

协议只能用作一般约束,因为它具有Self或relatedType要求

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

协议只能用作一般约束,因为它具有Self或relatedType要求

现在假设我们调整您的协议以添加一个使用关联类型的例程:

public protocol RequestType: class {    associatedtype Model    var path: String { get set }    func frobulateModel(aModel: Model)}

Swift可以让您

RequestType
按照自己的方式创建数组。我可以将这些请求类型的数组传递给函数:

func handleQueueOfRequests(queue: [RequestType]) {    // frobulate All The Things!    for request in queue {       request.frobulateModel()    }}

我到了要散布所有东西的地步,但是我需要知道将哪种类型的参数传递给调用。我的某些

RequestType
实体可以采用
LegoModel
,有些可以采用
PlasticModel
,而另一些可以采用
PeanutButterAndPeepsModel
。Swift对歧义性不满意,因此它不会让您声明具有关联类型的协议变量。

同时,例如,

RequestType
当我们知道它们所有人都使用时,创建一个数组非常有意义
LegoModel
。这似乎是合理的,而且确实如此,但是您需要某种表达方式。

一种方法是创建一个将真实类型与抽象Model类型名称相关联的类(或struct或enum):

class LegoRequestType: RequestType {  typealias Model = LegoModel  // Implement protocol requirements here}

现在声明一个数组是完全合理的,

LegoRequestType
因为如果我们想要
frobulate
所有这些数组,我们知道我们必须
LegoModel
每次都传递。

与关联类型的这种细微差别使使用它们的协议变得特别。Swift标准库最著名的协议就是这样的

Collection
Sequence

为了使您能够创建一组实现

Collection
协议的事物或一组实现序列协议的事物,标准库采用了一种称为“类型擦除”的技术来创建结构类型
AnyCollection<T>
AnySequence<T>
。要在Stack
Overflow答案中进行解释,类型擦除技术相当复杂,但是如果您在网上搜索,则会有很多关于它的文章。

我可以推荐来自Alex Gallagher的有关YouTube
上具有关联类型协议(PAT)的视频。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649622.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号