Swift4.0复习协议
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复习协议的更多相关文章
- Swift4.0复习特性、编译标志和检查API的可用性
1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...
- Swift4.0复习访问控制与作用域
1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...
- Swift4.0复习错误处理
1.Swift中错误的表示: “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可.我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观 ...
- Swift4.0复习扩展
1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...
- Swift4.0复习类型定义、类型投射等操作
1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32 /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...
- Swift4.0复习类
1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...
- Swift4.0复习基本语法简介
1.五种类型: 包含五种类型——枚举(enum).结构体(struct).类(class).协议( protocol)以及函数类型(function types). 2.变量对象:var 3.常量对象 ...
- Swift4.0复习结构体
1.基本语法: /** 定义了一个结构体 */ struct Structure { /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty = /// ...
- Swift4.0复习枚举
1.枚举类型: “Swift编程语言中,枚举类型属于值类型,而不是引用类型.” 摘录来自: “大话Swift 4.0”. iBooks. 2.枚举类型和枚举对象的定义: enum Enumeratio ...
随机推荐
- 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
只有TCP有粘包现象,UDP永远不会粘包! 粘包:在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收).如,对方第一次发送hello,第二次发送world, 在接收时,应该收两次,一次是he ...
- go同步互斥锁
import "sync" var ( myMap = make(map[int]int, 10) lock sync.Mutex //声明一个全局的互斥锁 //sync 包 同步 ...
- 使用对象,面向对象创建div的方式
<script> // //对象div的创建 // var div = document.createElement("div"); // document.body. ...
- 模拟赛 提米树 题解 (DP+思维)
题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...
- redis详解(包含使用场景)
本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据类型的使用场景5.redis的过期策略以及内存淘汰 ...
- 使用jquery修改display属性
var show = $('#test').css('display'); $('#test').css('display',show =='block'?'none':show); 这段代码通过判断 ...
- [c++11]右值引用、移动语义和完美转发
c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...
- git revert 让提交不再害怕
git revert 让提交不再害怕 使用了好多命令, 但对于 git revert 一直不敢怎么使用, 为什么呢? 因为 git merge 的存在. 每次 对于 git merge 的分支, 执行 ...
- docker nginx angular 刷新错误,404错误
主要是router问题,两个解决方案 一个是修改angular项目的router选项,一个是修改Nginx的route 选项 一般情况下项目部署了,不愿意修改angular项目的router选项,所以 ...
- ActiveMq 本地安装及启动(Windows)
首先下载MQ的安装包 http://activemq.apache.org/download.html 1.点击最新版本的ActiveMQ的 2.这里有窗户版本和Linux的的版本,这里我们选择窗口版 ...