1.协议的定义:

/// 定义一个协议MyProt
protocol MyProt {
 
/// 声明了一个实例方法foo,
/// 其类型为:() -> Void
func foo()
 
/// 声明了一个实例方法doSomething,
/// 其类型为(Int) -> Int?
/// 它可用于结构体与枚举类型中的可修改存储式实例属性的方法
mutating func doSomething(a: Int) -> Int?
 
/// 声明了一个类型方法typeMethod,
/// 其类型为() -> Void
class func typeMethod()
 
/// 声明了一个初始化器方法
init(a: Int)
 
/// 声明了一个下标
subscript(index: Int) -> Int { get set }
 
/// 声明了一个计算式实例属性
var property: Int { get set }
 
/// 声明了一个计算式类型属性,
/// 并且是只读的
static var typeProperty: Double { get }
}

2.协议的遵循:

struct Test: MyProt {
var a: Int
init(a: Int) {
self.a = a
}
}

3.协议的继承:

protocol ProtA {
func foo()
func method()
 
var property: Int { get set }
}
 
/// 定义一个协议ProtB
protocol ProtB {
mutating func method(a: Int)
 
var property: Double { get set }
}
 
/// 定义了一个协议ProtC,
/// 它继承了ProtA与ProtB
protocol ProtC: ProtA, ProtB {
 
func foo()
}

4.class协议:

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

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

5.协议组合:

/// 定义了一个协议ProtA
protocol ProtA {
func foo()
func method()
}
 
/// 定义一个协议ProtB
protocol ProtB {
mutating func method(a: Int)
 
var property: Int { get set }
}
 
/// 定义结构体Test,
/// 它遵循了ProtA与ProtB协议
struct Test: ProtA, ProtB {
 
var a =
 
/// 实现ProtA中的foo方法
func foo() {
print("This is a foo")
}
 
/// 实现ProtA中的method方法
func method() {
print("This is a method")
}
 
/// 实现ProtB中的method(a:)方法
mutating func method(a: Int) {
self.a += a
}
 
/// 实现ProtB中的property计算式实例属性
var property: Int {
get {
return self.a
}
// 声明了一个prot对象,
// 它同时遵循了ProtA与ProtB协议,
// 这里就使用了协议组合语法特性。
// 然后用Test结构体的对象实例为它初始化
var prot: ProtA & ProtB = Test()
 
prot.foo()
prot.method()
prot.property =
prot.method(a: )
 
// 打印:value = 15
print("value = \(prot.property)")

6.关联类型:

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

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

protocol ProtA {
/// 这里声明了一个关联类型DataType
associatedtype DataType
 
/// 声明了实例方法method,
/// 它具有一个DataType类型的形参value
func method(value: DataType)
}
 
/// 定义了一个结构体MyStruct,
/// 并遵循了协议ProtA
struct MyStruct: ProtA {
 
/// 这里通过typealias指定协议关联类型的具体类型,
/// 在MyStruct类型中,
/// DataType的具体类型为Int
typealias DataType = Int
}

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

/// 定义协议MyProt
protocol MyProt {
 
/// 这里所声明的method方法含有一个Self类型的形参
mutating func method(obj: Self)
}
 
/// 定义结构体类型MyStruct,
/// 遵循了协议MyProt
struct MyStruct: MyProt {
 
/// 定义了一个存储式实例属性data,
/// 它的类型为Int
var data =
 
/// 实现了MyProt中的method(obj:)方法
mutating func method(obj: MyStruct) {
data += obj.data
}
}

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. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

    只有TCP有粘包现象,UDP永远不会粘包! 粘包:在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收).如,对方第一次发送hello,第二次发送world, 在接收时,应该收两次,一次是he ...

  2. go同步互斥锁

    import "sync" var ( myMap = make(map[int]int, 10) lock sync.Mutex //声明一个全局的互斥锁 //sync 包 同步 ...

  3. 使用对象,面向对象创建div的方式

    <script> // //对象div的创建 // var div = document.createElement("div"); // document.body. ...

  4. 模拟赛 提米树 题解 (DP+思维)

    题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...

  5. redis详解(包含使用场景)

    本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据类型的使用场景5.redis的过期策略以及内存淘汰 ...

  6. 使用jquery修改display属性

    var show = $('#test').css('display'); $('#test').css('display',show =='block'?'none':show); 这段代码通过判断 ...

  7. [c++11]右值引用、移动语义和完美转发

    c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...

  8. git revert 让提交不再害怕

    git revert 让提交不再害怕 使用了好多命令, 但对于 git revert 一直不敢怎么使用, 为什么呢? 因为 git merge 的存在. 每次 对于 git merge 的分支, 执行 ...

  9. docker nginx angular 刷新错误,404错误

    主要是router问题,两个解决方案 一个是修改angular项目的router选项,一个是修改Nginx的route 选项 一般情况下项目部署了,不愿意修改angular项目的router选项,所以 ...

  10. ActiveMq 本地安装及启动(Windows)

    首先下载MQ的安装包 http://activemq.apache.org/download.html 1.点击最新版本的ActiveMQ的 2.这里有窗户版本和Linux的的版本,这里我们选择窗口版 ...