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. python - djanog (静态文件)

    # 在 setting 文件中的 static ,通过这个方法(别名) 可以拼接到其它文件夹中的文件 # 第一步: 导入 # {% load static %} # 第二步: 查找 static (别 ...

  2. Mysql 根据时间取出每组数据中最新的一条

    下策——查询出结果后将时间排序后取第一条 select * from a where create_time<="2017-03-29 19:30:36"order by c ...

  3. asp.net+ tinymce粘贴word

    公司做的项目需要用到粘贴Word功能.就是将word内容一键粘贴到网页编辑器(在线富文本编辑器)中.Chrome+IE默认支持粘贴剪切板中的图片,但是我要粘贴的文章存在word里面,图片多达数十张,我 ...

  4. redis堵死致数据清空

    情景: zy的链路监控突然都恢复,而且在哪个时间段zabbix中显示回复,也发送了告警,但是实际上告警并没有发出来.这是不可能的情况,应该是redis缓存中的数据都被清空了,没有认为干预,需解决问题 ...

  5. (2)Angular的开发

    什么是 ReactNative应用, 小程序与RN的关系 native端优化 Js端优化 ReactNative是? 用JavaScript来写App,性能好 异步编程 请点赞!因为你的鼓励是我写作的 ...

  6. Flower(规律+逆向思维)

    Flower: 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6486 题解: 逆向思维+规律 因为每次剪n-1,所以逆向就是控制n-1朵不变,每次增高1 ...

  7. 原创:Solr Wiki 中关于Suggester(搜索推荐)的简单解读

       Solr Wiki Suggester Suggester - a flexible "autocomplete" component.(搜索推荐) A common nee ...

  8. input的禁止标签

    <body> <input type="text" name="" value="你好" disabled="d ...

  9. ES6中的class类的理解

    传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ...

  10. IIS错误代码500.21 ,Nhibernate更新报错,委托的使用。action传参数

    快速阅读 IIS错误代码500.21 ,Nhibernate更新报错,委托的使用.action传参数 IIS错误代码500.21 HTTP 错误 500.21 - Internal Server Er ...