专栏首页大话swift再说swift namespace

再说swift namespace

之前写过namespace的问题不过后续都是没怎么使用,时下rx,snp…大家都应经不再陌生,也是比较常见的,今天我们结合struct 泛型 class一起看个综合的实例 通常我们使用命名空间都是基于一个具体的实例进行的二次封装(大家公认的)而封装的载体通常是struct,然后对struct进行extension 背景: 最经在搞protocol buffer来进行数据压缩,减轻网络流量,于是有了今天的文章

结构定义 在vapor中我们想简单的返回pb数据不是那么简答,因此对返回数据进行了一个包装

1 返回数据格式

public struct PB<T> : Content where T: Message{ var value: Data init(_ data: T) throws { self.value = try data.serializedData() } }

2 request

extension Request{ public func makePB<T>(value: T) throws -> EventLoopFuture<PB<T>> where T: Message{ let result = self.eventLoop.newPromise(PB<T>.self) let pb = try PB.init(value) result.succeed(result: pb) return result.futureResult } }

有定义看到返回的是个基于Message的泛型struct,我们暂时放置于此,后续使用

namespace包装 1 格式定义

class PBBase<Base, T> where T: Message{ let base: PB<T> init(_ base: Base) { self.base = base as! PB<T> } }

2 协议定义

protocol PBProtocol { associatedtype PBType associatedtype T: Message var pb:PBType{get} }extension PBProtocol{ public var pb:PBBase<Self, T>{ return PBBase.init(self) } }

完成

extension PB : PBProtocol where T: Message{}

使用

func testPBBase(){ XCTAssert(pb?.pb.entry != nil, "测试失败") XCTAssert(pb?.pb.textFormatString() == bookInfo?.textFormatString(), "测试失败") XCTAssert(pb?.pb.textString == pb?.textString, "测试失败") }

我们再来回顾一下整个过程使用了什么 1 使用 where限定了PBProtocol的使用范围

2 protocol中associatedtype的综合使用

2.1 可以定义多个 2.2 可以定义一个具体的类型,也可定义个模糊的类型 github: https://github.com/skeyboy/SwiftVaporPB

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:YuLongLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gin框架之参数获取

    http://127.0.0.1:8080/get/query?b=2&e=1&e=2&f[a]=1&f[b]=2

    大话swift
  • gin框架之log处理

    我们自定义了log的记录方式,但是这种方式国语简单,不利于我们收集错误信息。在这里为大家推荐一个记录日志的库`github.com/sirupsen/logru...

    大话swift
  • SwiftUI 中的Stack

    就从Stack说起,stack查看文档我们看到HVZ三种stack,那么分别是怎么用的呢?

    大话swift
  • burpsuite系列

    Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具。BurpSuite为这些工具设计了许多接口,以加快攻击应用程序的过程。

    斑马
  • Android Handler与Looper原理浅析

    本文分析下Android的消息处理机制,主要是针对Handler、Looper、MessageQueue组成的异步消息处理模型,先主观想一下这个模型需要的材料:

    看书的小蜗牛
  • 利用Javascript做后门的利用方式

    Ms08067安全实验室
  • The Algorithms

    在Github上面看到一个印度人维护的关于算法的项目The Algorithms,里面有各种主流语言如C++、C、Java、C#、Python、PHP、Go、J...

    ccf19881030
  • ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈

    原文出处:https://bohutang.me/2020/06/08/clickhouse-and-friends-mysql-protocol-write-...

    老叶茶馆
  • 加载RAM磁盘编译Xcode项目

    每次对Xcode iOS项目进行clean、build或者在iOS虚拟机上launch,Xcode都会在DeriveData文件夹中进行读写操作。换句话说,就是...

    freesan44
  • 使用tensorflow根据输入更改tensor shape

    涉及随机数以及类RNN的网络构建常常需要根据输入shape,决定中间变量的shape或步长。

    砸漏

扫码关注云+社区

领取腾讯云代金券