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 ...
随机推荐
- Decode Ways II
Description A message containing letters from A-Z is being encoded to numbers using the following ma ...
- Bootstrap是什么意思?
Bootstrap是一组用于网站和网络应用程序开发的开源前端(所谓“前端”,指的是展现给最终用户的界面.与之对应的“后端”是在服务器上面运行的代码)框架,包括HTML.CSS及JavaScript的框 ...
- JS AJAX和JSONP的基础功能封装以及使用示例;
1.代码: function ajax(options){ options = options || {}; options.type = options.type || "get" ...
- Windows系统错误处理机制
一.什么是错误 意为意为不正确,与正确答案相反.我们这里讲的是Windows操作系统里进程运行时产生的错误.对我们程序员来说,其实也就是我们编程过程中,调用Windows系统提供的API.COM 接口 ...
- D. Vasya and Triangle(思维, 三角形)
传送门 题意: 给你 n, m, k, 问你是否存在一个三角形, 满足三角形的面积等于 n * m / k: 若存在, 输出YES, 且输出满足条件的三角形的三个坐标(答案有多种,则输出任意一种) ...
- c语言实现杨辉三角形
#include <stdio.h> int main(void) { int a[9][9]={}; int i,j; for(i=0;i<9;i++){ for(j=0;j< ...
- mac中强大的快捷键
用mac本不过一年左右, 但是越用越感觉到mac的强大. 只是从快捷键这个方面去说吧. 与 windows 系统的比较 从接触电脑开始, 就是与windows为伍, 最初的window98, xp 等 ...
- linux shell下面的几种proxy方式
设置ALL_PROXY环境变量 export ALL_PROXY=socks5://127.0.0.1:1080 支持socks5 http https 取消 export ALL_PROXY=&qu ...
- Pytest权威教程05-Pytest fixtures:清晰 模块化 易扩展
目录 Pytest fixtures:清晰 模块化 易扩展 Fixtures作为函数参数使用 Fixtures: 依赖注入的主要例子 conftest.py: 共享fixture函数 共享测试数据 生 ...
- webbench 源代码
WebBench源码:https://github.com/EZLippi/WebBench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问 ...