三个关注点:1、形式;2、实现方式;3、使用方式;

一、基本形式:

形式:内部无泛型类型;

实现:只需指定类型和实现相应的功能即可;

使用:可以用在其他类型出现的任何地方;

protocol Response {

/// The task metrics containing the request / response statistics.

var _metrics: AnyObject? { get set }

mutating func add(_ metrics: AnyObject?)

}

Protocols as Types

Protocols don’t actually implement any functionality themselves. Nonetheless, any protocol you create will become a fully-fledged type for use in your code.

Because it’s a type, you can use a protocol in many places where other types are allowed, including:

  • As a parameter type or return type in a function, method, or initializer
  • As the type of a constant, variable, or property
  • As the type of items in an array, dictionary, or other container

实现类提供:函数的具体实现和存储变量;

对于变量,提供同名的存储变量即可;

二、普通泛型形式:

形式:内部无高阶类型,只包含普通泛型类型;

实现:只需指定类型和实现相应的功能即可;

使用:只能用作泛型类型的约束;

Protocol 'TransformType' can only be used as a generic constraint because it has Self or associated type requirements

public protocol TransformType {

associatedtype Object

associatedtype JSON

func transformFromJSON(_ value: Any?) -> Object?

func transformToJSON(_ value: Object?) -> JSON?

}

open class DataTransform: TransformType {

public typealias Object = Data

public typealias JSON = String

public init() {}

open func transformFromJSON(_ value: Any?) -> Data? {

guard let string = value as? String else{

return nil

}

return Data(base64Encoded: string)

}

open func transformToJSON(_ value: Data?) -> String? {

guard let data = value else{

return nil

}

return data.base64EncodedString()

}

}

三、monad形式:

形式:内部有包含泛型的高阶类型,包含类型构造器,是低阶类型与高阶类型相互转换和引用的桥梁;

使用:只能用作泛型类型的约束;

实现:

1、指定类型和实现相应;

2、对泛型本身进行扩展,实现构造类型变量的赋值;

3、对构造类型进行扩展,实现更多的功能;

4、实现为一个泛型类型?

public protocol ReactiveCompatible {

/// Extended type

associatedtype CompatibleType

/// Reactive extensions.

var rx: Reactive<CompatibleType> { get set }

}

extension ReactiveCompatible {

/// Reactive extensions.

public var rx: Reactive<Self> {

get {

return Reactive(self)

}

set {

// this enables using Reactive to "mutate" base object

}

}

}

extension NSObject: ReactiveCompatible { }

//—————————————————————

public final class Kingfisher<Base> {

public let base: Base

public init(_ base: Base) {

self.base = base

}

}

public protocol KingfisherCompatible {

associatedtype CompatibleType

var kf: CompatibleType { get }

}

public extension KingfisherCompatible {

public var kf: Kingfisher<Self> {

return Kingfisher(self)

}

}

extension Kingfisher where Base: Image {

fileprivate(set) var animatedImageData: Data? {

get {

return objc_getAssociatedObject(base, &animatedImageDataKey) as? Data

}

set {

objc_setAssociatedObject(base, &animatedImageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

}

}

}

四、内部实现依赖于其它协议

形式:关联类型有其它协议约束

实现:

1、关联类型协议类型的实现:

2、关联类型所定义的变量的构造;

3、主协议的实现(引用关联类型的协议的实现);

本质:先实现依赖的协议,然后实现本协议

使用:同二

public protocol Sequence {

associatedtype Iterator : IteratorProtocol

public func makeIterator() -> Self.Iterator

// ...

}

public protocol IteratorProtocol {

associatedtype Element

public mutating func next() -> Self.Element?

}

struct _Iterator: IteratorProtocol {

var children: Mirror.Children

init(obj: Any) {

children = Mirror(reflecting: obj).children

}

mutating func next() -> String? {

guard let child = children.popFirst() else { return nil }

return "\(child.label.wrapped) is \(child.value)"

}

}

protocol Sequencible: Sequence { }

extension Sequencible {

func makeIterator() -> _Iterator {

return _Iterator(obj: self)

}

}

swift protocol的几种形式的更多相关文章

  1. 代替jquery $.post 跨域提交数据的N种形式

    跨域的N种形式: 1.直接用jquery中$.getJSON进行跨域提交 优点:有返回值,可直接跨域: 缺点:数据量小: 提交方式:仅get (无$.postJSON) $.getJSON(" ...

  2. C++:一般情况下,设计函数的形参只需要两种形式

    C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const ...

  3. jquery插件的两种形式

    这里总结一下jquery插件的两种形式,一种是通过字面量的形式组织代码,另一种是通过构造函数的方式.下面就两种形式来分析俩个例子. 例子1: ;(function ($,window,document ...

  4. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  5. 移动端App广告常见的10种形式

    什么是App广告?   App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别. App广告兴起得益于其载体—App的风行.平板电脑和大屏触 ...

  6. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  7. Struts2中Action接收参数的四种形式

    1.Struts2的Action接收参数的三种形式.      a. 使用Action的属性接收(直接在action中利用get方法来接收参数):                   login.js ...

  8. Node.js-提供了四种形式的定时器

    Node.js提供了四种形式的定时器 global.setTimeout(); //一次性定时器 global.setInterval(); //周期性定时器 global.nextTick(); / ...

  9. 参数传递的四种形式----- URL,超链接,js,form表单

    什么时候用GET,  查,删, 什么时候用POST,增,改  (特列:登陆用Post,因为不能让用户名和密码显示在URL上) 4种get传参方式 <html xmlns="http:/ ...

随机推荐

  1. PetaPoco源代码学习--0.目录贴

    2017年3季度后,以人力外包的形式派驻到甲方单位进行项目救急时,接触到了甲方单位的ASP.NET MVC项目的ORM框架,它以PetaPoco(2012年的老版本)进行改造升级的,当初就想学习一下这 ...

  2. C# 函数 递归

    函数:独立完成某项功能的一个个体,有固定功能函数有 高度抽象函数. 作用: 提高代码的重用性 提高功能开发的效率 提高程序代码的可维护性 函数四要素:   输入       输出       函数名  ...

  3. [css3] 看博客学习别人的旋转的星球

    定义一个div 太阳轨道sunline,边框显示出来,定义position为relative #sunline{ width: 500px; height: 500px; border:2px sol ...

  4. Java基础——String类(一)

    一.String 类代表字符串 Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串 ...

  5. django admin登陆添加修改内容

    model文件中 __all__ = ["Book", "Publisher", "Author"] from django.db impo ...

  6. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

  7. Onsen UI for React文档

    注:采用ES6+JSX语法 1.开始一个项目 在React中使用Onsen UI 需要首先安装onsenui和react-onsenui模块. 可以使用monaca CLI工具包快速初始化一个应用: ...

  8. 【读书笔记】iOS-应用程序剖析

    一,Default.png 包含应用程序默认扉页的PNG图像文件.用户运行应用程序时,iPhone会用此图片显示一个动画,产生由小变大来到屏幕前的效果.应用程序的Default.png文件加载后会不断 ...

  9. SD从零开始09-10

    SD从零开始9 数据流(Data Flow) 根据参考创建Create with reference 可以参考之前的凭证来创建销售凭证,可以在初始画面,也可以在凭证处理过程中,通过uniform. d ...

  10. 活字格Web应用平台学习笔记3-显示数据列表

    活字格第二课的目标,用活字格创建一个简单的在线数据管理系统. 看下设计界面.刚开始跟着点,有点懵圈,到做完,回忆了一下,其实就是先建一张表,然后,把表和页面联系起来,即在页面中划出一些区域,和表的字段 ...