三个关注点: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. 在ASP.NET MVC应用程序中随机获取一个字符串

    在开发ASP.NET MVC应用程序时,有可能需要一个随机字符串,作为密码或是验证码等. 如果你需要的是SQL版本,可以参考<密码需要带特殊字符(二)>http://www.cnblogs ...

  2. HDFS 命令大全

    目录 概要 用户命令 dfs 命令 追加文件内容 查看文件内容 得到文件的校验信息 修改用户组 修改文件权限 修改文件所属用户 本地拷贝到 hdfs hdfs 拷贝到本地 获取目录,文件数量及大小 h ...

  3. HDU2643(SummerTrainingDay05-P 第二类斯特林数)

    Rank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 数据库概念:码 键 Key & 范式 Normal Form

    参考资料 数据库管理系统原理与设计(Database Mangement System 3rd) 百度 wiki 术语对照 码 = 键 = Key 码约束 = Key Constraints 码约束 ...

  5. Software-Defined Networking A Comprehensive Survey --阅读_day1

    The Internet has led to the creation of a digital society, where (almost) everything is connected an ...

  6. django使用小贴士

    问题一: RuntimeError: Model class user.models.UserAccount doesn't declare an explicit app_label 解决方案 方案 ...

  7. 【代码笔记】iOS-My97DatePicker日历

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  8. js的style.display小问题

    在元素添加class样式隐藏display:none; 使用console.log(xx.style.display);//空值

  9. VS 2015 报错 " 'unistd.h': No such file or directory" 的解决办法

    使用 Visual Studio 2015 进行程序开发工作时,如果编译的是来自于Linux平台的源文件,该源文件可能会包含头文件 uninstd.h,这样会产生报错信息: "fatal e ...

  10. 特来电CMDB应用实践

    配置管理数据库(Configuration Management Database,以下简称CMDB)是一个老生常谈的话题,不同的人有不同的见解,实际应用时,因为企业成熟度以及软硬件规模不同,别人的成 ...