1.协议的定义:

  1. /// 定义一个协议MyProt
  2. protocol MyProt {
  3.  
  4. /// 声明了一个实例方法foo,
  5. /// 其类型为:() -> Void
  6. func foo()
  7.  
  8. /// 声明了一个实例方法doSomething,
  9. /// 其类型为(Int) -> Int?
  10. /// 它可用于结构体与枚举类型中的可修改存储式实例属性的方法
  11. mutating func doSomething(a: Int) -> Int?
  12.  
  13. /// 声明了一个类型方法typeMethod,
  14. /// 其类型为() -> Void
  15. class func typeMethod()
  16.  
  17. /// 声明了一个初始化器方法
  18. init(a: Int)
  19.  
  20. /// 声明了一个下标
  21. subscript(index: Int) -> Int { get set }
  22.  
  23. /// 声明了一个计算式实例属性
  24. var property: Int { get set }
  25.  
  26. /// 声明了一个计算式类型属性,
  27. /// 并且是只读的
  28. static var typeProperty: Double { get }
  29. }

2.协议的遵循:

  1. struct Test: MyProt {
  2. var a: Int
  3. init(a: Int) {
  4. self.a = a
  5. }
  6. }

3.协议的继承:

  1. protocol ProtA {
  2. func foo()
  3. func method()
  4.  
  5. var property: Int { get set }
  6. }
  7.  
  8. /// 定义一个协议ProtB
  9. protocol ProtB {
  10. mutating func method(a: Int)
  11.  
  12. var property: Double { get set }
  13. }
  14.  
  15. /// 定义了一个协议ProtC,
  16. /// 它继承了ProtA与ProtB
  17. protocol ProtC: ProtA, ProtB {
  18.  
  19. func foo()
  20. }

4.class协议:

“在一个协议后面使用 : class 即可将该协议声明为类协议,这样只有类类型才能遵循该协议,而结构体与枚举类型则不能遵循该协议。”

摘录来自: “大话Swift 4.0”。 iBooks.

5.协议组合:

  1. /// 定义了一个协议ProtA
  2. protocol ProtA {
  3. func foo()
  4. func method()
  5. }
  6.  
  7. /// 定义一个协议ProtB
  8. protocol ProtB {
  9. mutating func method(a: Int)
  10.  
  11. var property: Int { get set }
  12. }
  13.  
  14. /// 定义结构体Test,
  15. /// 它遵循了ProtA与ProtB协议
  16. struct Test: ProtA, ProtB {
  17.  
  18. var a =
  19.  
  20. /// 实现ProtA中的foo方法
  21. func foo() {
  22. print("This is a foo")
  23. }
  24.  
  25. /// 实现ProtA中的method方法
  26. func method() {
  27. print("This is a method")
  28. }
  29.  
  30. /// 实现ProtB中的method(a:)方法
  31. mutating func method(a: Int) {
  32. self.a += a
  33. }
  34.  
  35. /// 实现ProtB中的property计算式实例属性
  36. var property: Int {
  37. get {
  38. return self.a
  39. }
  1. // 声明了一个prot对象,
  2. // 它同时遵循了ProtA与ProtB协议,
  3. // 这里就使用了协议组合语法特性。
  4. // 然后用Test结构体的对象实例为它初始化
  5. var prot: ProtA & ProtB = Test()
  6.  
  7. prot.foo()
  8. prot.method()
  9. prot.property =
  10. prot.method(a: )
  11.  
  12. // 打印:value = 15
  13. print("value = \(prot.property)")

6.关联类型:

使用 associatedtype 关键字来声明关联类型。

typealias 关键字来指定关联类型的具体类型。

  1. protocol ProtA {
  2. /// 这里声明了一个关联类型DataType
  3. associatedtype DataType
  4.  
  5. /// 声明了实例方法method,
  6. /// 它具有一个DataType类型的形参value
  7. func method(value: DataType)
  8. }
  9.  
  10. /// 定义了一个结构体MyStruct,
  11. /// 并遵循了协议ProtA
  12. struct MyStruct: ProtA {
  13.  
  14. /// 这里通过typealias指定协议关联类型的具体类型,
  15. /// 在MyStruct类型中,
  16. /// DataType的具体类型为Int
  17. typealias DataType = Int
  18. }

7.关于协议中Self类型:表示遵循该协议的具体类型

  1. /// 定义协议MyProt
  2. protocol MyProt {
  3.  
  4. /// 这里所声明的method方法含有一个Self类型的形参
  5. mutating func method(obj: Self)
  6. }
  7.  
  8. /// 定义结构体类型MyStruct,
  9. /// 遵循了协议MyProt
  10. struct MyStruct: MyProt {
  11.  
  12. /// 定义了一个存储式实例属性data,
  13. /// 它的类型为Int
  14. var data =
  15.  
  16. /// 实现了MyProt中的method(obj:)方法
  17. mutating func method(obj: MyStruct) {
  18. data += obj.data
  19. }
  20. }

Swift4.0复习协议的更多相关文章

  1. Swift4.0复习特性、编译标志和检查API的可用性

    1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...

  2. Swift4.0复习访问控制与作用域

    1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...

  3. Swift4.0复习错误处理

    1.Swift中错误的表示: “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可.我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观 ...

  4. Swift4.0复习扩展

    1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...

  5. Swift4.0复习类型定义、类型投射等操作

    1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32   /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...

  6. Swift4.0复习类

    1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...

  7. Swift4.0复习基本语法简介

    1.五种类型: 包含五种类型——枚举(enum).结构体(struct).类(class).协议( protocol)以及函数类型(function types). 2.变量对象:var 3.常量对象 ...

  8. Swift4.0复习结构体

    1.基本语法: /** 定义了一个结构体 */ struct Structure {   /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty =   /// ...

  9. Swift4.0复习枚举

    1.枚举类型: “Swift编程语言中,枚举类型属于值类型,而不是引用类型.” 摘录来自: “大话Swift 4.0”. iBooks. 2.枚举类型和枚举对象的定义: enum Enumeratio ...

随机推荐

  1. Decode Ways II

    Description A message containing letters from A-Z is being encoded to numbers using the following ma ...

  2. Bootstrap是什么意思?

    Bootstrap是一组用于网站和网络应用程序开发的开源前端(所谓“前端”,指的是展现给最终用户的界面.与之对应的“后端”是在服务器上面运行的代码)框架,包括HTML.CSS及JavaScript的框 ...

  3. JS AJAX和JSONP的基础功能封装以及使用示例;

    1.代码: function ajax(options){ options = options || {}; options.type = options.type || "get" ...

  4. Windows系统错误处理机制

    一.什么是错误 意为意为不正确,与正确答案相反.我们这里讲的是Windows操作系统里进程运行时产生的错误.对我们程序员来说,其实也就是我们编程过程中,调用Windows系统提供的API.COM 接口 ...

  5. D. Vasya and Triangle(思维, 三角形)

    传送门 题意: 给你 n, m, k, 问你是否存在一个三角形, 满足三角形的面积等于 n * m / k: 若存在, 输出YES, 且输出满足条件的三角形的三个坐标(答案有多种,则输出任意一种)   ...

  6. c语言实现杨辉三角形

    #include <stdio.h> int main(void) { int a[9][9]={}; int i,j; for(i=0;i<9;i++){ for(j=0;j< ...

  7. mac中强大的快捷键

    用mac本不过一年左右, 但是越用越感觉到mac的强大. 只是从快捷键这个方面去说吧. 与 windows 系统的比较 从接触电脑开始, 就是与windows为伍, 最初的window98, xp 等 ...

  8. linux shell下面的几种proxy方式

    设置ALL_PROXY环境变量 export ALL_PROXY=socks5://127.0.0.1:1080 支持socks5 http https 取消 export ALL_PROXY=&qu ...

  9. Pytest权威教程05-Pytest fixtures:清晰 模块化 易扩展

    目录 Pytest fixtures:清晰 模块化 易扩展 Fixtures作为函数参数使用 Fixtures: 依赖注入的主要例子 conftest.py: 共享fixture函数 共享测试数据 生 ...

  10. webbench 源代码

    WebBench源码:https://github.com/EZLippi/WebBench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问 ...