类型擦除— Apagando tipos!?

向前,向后,向后,向前,向后,向后推荐方案的协议:

  • https://www.raywenderlich.com/148448/introducing-protocol-oriented-programming
  • https://developer.apple.com/videos/play/wwdc2015/408/

Mas por queiríamosquerer“ apagar” um tipo?

您可以在法律上迅速获得Swiftéuma linguagem fortemente tipada的权利 。 可以通过entãoiríamosquerer“ apagar” um tipo吗? 参赞者,vamos primeiro参评者,que queremos solucionar com essaestratégia。 Swift和jáse aventurou pelas suas的通用协议具有 maisavançadas,dave ter tentado usar与“ famosos” 相关类型 (tipos associados)。

注意 :在Swift 2.2中引入了相关类型,而在“ typealias”时代之前,它已被使用

Em resumo,um 关联类型 ,通用协议的 nada maisédo que ”,“ propusade”的服务对象,parâmetro, “ retorno demétodos”等的服务。Imagine-o como uma caixa vazia,que deve总理普鲁尼罗塞普雷尼西达公司与美国阿尔萨马州库萨特。

最好的示例,协议的分发者,或对象执行者响应的高质量定义接口。

Esse协议定义了umafunçãocom参数:umainstânciade URLRequest e dois blocos,um ce ce。

想象一下, 调度员使用 URLRequest作为请求时的必要请求。 通用的必要性的必要条件是:

请注意,在执行功能之前,必须先执行“ 请求”限定符,然后才能成功执行“ 输出”限定符。
定义/类实现和协议实现的协议类型(“ preenchendo”或“ caixa vazia”):

事例调度员。

HTTPDispatcher ,如何实现协议的功能,还是声明?

  func execute(请求:URLRequest,成功:(数据)->无效,失败:(错误)->无效) 

编译器要求输入 “ preenchido”,URL 请求, 输出 “ preenchido” por 数据

Atéagora nenhuma grande novidade。 实例 ,例如:幻想UM 结构 chamada GetMoviesTask ,响应执行者的调度员请求,服务对象,接收到数据的转换对象。 电影,自然调度员escolhido seria用户或nosso HTTPDispatcher的JSON终结点和电影的支持者 。 Mas comotambémqueremos testes para o nossocódigo,deveremos ser capazes de utilizar o TestHTTPDispatcher 。 O objetivoépossibilitar algo como:

声明GetMoviesTask ,或随时随地使用Todos调度程序:protocolo Dispatcher

porém,执行董事,商标veremos um erro:

 错误:协议“ Dispatcher”仅具有通用或相关类型要求,因此只能用作通用约束 

(traduçãolivre-错误:由util关联类型,协议“ Dispatcher”或Pod Ser USado Como como uma“restriçãogenérica”(?))

扩展到com 类型的擦除

协议,相关类型,摘要和摘要

总理马萨斯(Maaas),阿尔莫斯(Almos)警察,警察,警察和警察。
快速协议,快速通缉令,普通通缉令,可变通行证,专有礼,准参保函/通行证等。

可以使用通用类型,也可以使用任意形式的协议。 Isso quer dizer的er的deuxa de serum um的“usável”的目录通过了一个雪松的appenas um 模板 ,例如,portanto,usapvel的apenas como“padrão” para outros tipos – algo como uma的“ casca” ser preenchida。

Afinal de contas,aoclaralamos

 让调度员:调度员 

Qual o 请求委托? 质量o 输出委托? Diferentemente de tiposgenéricos(通用类型),与“ especificar”或其他类型相关联的类型为 umadeclaração。

Declaraçãoinválida!

Passando borracha!

Bom,协议类型 ,特定类型相关类型 durante umadeclaração,主要结构/类,com属类,genesricos podem。 一种解决方案, 类型为Erasure,类型为擦除, 代理 / 代理为nosso协议。

科莫? Veja ocódigoabaixo:

请注意AnyDispatcher实现方法,该方法执行 Dispatcher协议,执行bloexec chamado _execute 。 程序的无人操作演示文稿,没有Swift的,无提示的ontra podemos tratarfunções和métodoscomo tiposmanipuláveis,无意识的初始化器armazenar umacópiadométoo 执行了 desse- Dispatcher的协议。

Àprimeira vista pode parecer complicado,entãovamos detalhar cada parte:

  struct AnyDispatcher :分派器 

Estamas declarando uma struct com dois tiposgenéricos: R ,para代表a nossa 请求 ,e O ,para代表a nosso 输出

 私人let _execute:(R,(O)->虚空,(Error)->虚空)->虚空 

裁军执行人阿瓜扎纳拉(Properedade quearmazenará) 请注意,如果执行以下命令会导致错误,请执行-primeiroparémetroéuma Request (R),然后输出 (O)并返回错误

  init (_调度程序:D)其中R == D.Request,O == D.Output 

Esta talvez a parte mais complexa。 Lembrando que Dispatchernãopode ser usado diretamente como um tipo noparâmetro,então“ pulo do gato” aquiédeclarar oparâmetrocomo D ,on de Déumparâmetrogenéricoqualquer que Implementa o protocolo Dispatcher (“ Dispatcher (” )。 Nesse contexto,o uso do Dispatcher como tipoéallowido porque podemos especificar qual vai ser o tipo real dos relatedtypes request e Output – issoéfeito justamente nacláusula其中: “其中R == D.Request,O == D.Output” 。 Esse comandoestábasicamente garantindo ao编译器为quesassociatedtype sserão tipos reais,“ concretos” 请求 seráo R ,bem como o 输出 seráo O。 Finalmente, R e Osãoentãodefinidos nadeclaraçãoda nossa结构:

declaraçãoválida! R (e sua vez D.RequestSeráURLSession e O (e D.Output )será 数据

Voltando ao示例性结构GetMoviesTask和podemos finalmente实现器:

Tipo da propriedade 调度员 agoraéAnyDispatcher

即时分发帮助,立即分发调度员,再到真正的调度员吧!

Conclusão

T,Enenti o uso de uma struct com tiposgenéricospara代表ar Protocol com 关联类型 。 Mas porque diabos esse“ truque”échamado de Type Erasure

即时通讯的任何实例都可以通过HTTPDispatcher进行即时通讯

标志徽标, httpDispatcherseráremovido damemória。 anyDispatcher可能出现的任何问题HTTP最初的Dispatcher ,可能是“原始” HTTPDispatcher的消息执行 “强制执行” 。 Desse Modo,请在HTTPDispatcher上找到 “ apagado”(perdido)!

Eééééééééééééééééééééééééééééééééééééééééééééééééééééíçãoééééééééééééééééééééééééééééééééééééééééééííéééííção O AnyAlgumaCoisa semper vai armazenar作为相关信息 (métodose / ou propriedades)做“原始”的事,可能是instância“原始”的事,请注意!

Apple(苹果)不能在Swift上进行装饰。 例如,AnyHashable,AnyCollection,AnySequence,AnyIterator会添加提示。 请注意,如果要使用某些类型的擦写,请使用 nasdocumentações链接!

类型擦除的哈希值。

推荐人

  • https://www.natashatherobot.com/swift-type-erasure/
  • http://robnapier.net/erasure

Interesting Posts