75142913在线留言
【进阶篇】1  协议(protocol)的定义与使用及常用的系统协议_IOS开发_网络人

【进阶篇】1 协议(protocol)的定义与使用及常用的系统协议

Kwok 发表于:2021-03-22 13:22:49 点击:4 评论: 0

协议能让你定义类型需要满足的接口,满足某个协议的类型被称为符合这个协议,比如在后期的SwiftUI中的第一件事就是要满足View协议

协议是描述一组特定的相似动作或行为的方法的集合:一个表视图应该有多少行?多少节?章节标题应该是什么?用户可以移动行吗?如果是这样,当他们这样做时会发生什么?

协议是一种用来表达 API 更加简洁的方式。使用 protocols(协议),可以让调用者传递他们想要的任何Class类/struct结构体、enum枚举,但是通常调用者需要实现协议规定的方法和属性。

协议本质就是让调用者(实现协议者)用任何它想的东西调用一个应用程序接口(API)的方法。可以是结构体、枚举类型、类等,并且可以传递任何的参数。协议实际上就是一个变量和函数的清单,一个由变量和函数组成的清单,如果要符合协议就需要在在应用程序接口中使用清单里的变量与函数,以表达遵守的协议。

协议让应用程序接口变得非常灵活且易于表达,对标准化匿名通讯机制是非常有好处的,如MVC 视图和控制器之间的通信中那些will, did, should, data, at, count 方法,视图与控制器之间匿名通信的方式(因为视图是泛型的)。而协议就是如何让MVC正常工作。

所有这些问题都涉及到类似的事情:数据进入UITableView。结果,它们都进入了一个称为的协议UITableViewDataSource。该协议内部的某些行为是可选的。例如,canEditRowAt是可选的,如果您自己不提供值,则默认为true。

一、协议的定义

Swift的协议本质上是一种让我们定义功能并在需要时提供默认实现的方法。它们是该语言的基本功能,它使我们能够强制执行类型要求,创建单元测试模拟,轻松共享功能等等。

 1、自定义一个协议

//自己定义一个协议
protocol MyProtocol {
    //下面是一个协议内容
    var marks: Int { get set } //定义一个可读写属性
    var result: Bool { get }//定义一个只读属性
    
    func attendance() -> String//定义一个返回String的方法
}

2、使用协议:

//使MyClass符合MyProtocol协议
class MyClass: MyProtocol {
    var marks = 0
    var result = true
    
    func attendance() -> String{
        return "neter8.com"
    }
}

二、内置协议的使用

在Swift中工作时,经常需要使您的类符合协议。这是通过将协议名称添加到类定义中,然后填写所需的任何方法来完成的,如下所示:

class ViewController: UIViewController, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //请求10行
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 返回一个虚拟的表格视图单元格;您自己的代码应该使用原型单元格或类似的东西
        return UITableViewCell()
    }
}

当您这样做时(当您向Swift保证您的类符合协议时),您会很害怕它会检查以确保您是对的。这意味着,如果您未添加对所有必需方法的支持,它将拒绝构建您的代码,这是一种有用的安全措施。

三、SwiftUI中经常使用到的内置协议

1、运算及比较类的协议

  • protocol Equatable 可以比较值相等的一种类型。
  • protocol Comparable 可以使用的关系运算符进行比较A型<,<=,>=,和>。
  • protocol Identifiable 一类类型,其实例持有具有稳定标识的实体的值。

2、哈希类协议

  • protocol Hashable 可以哈希为一个Hasher以产生整数哈希值的类型。
  • struct Hasher Set和使用的通用哈希函数Dictionary。

3、表示字符串类的协议

  • protocol CustomStringConvertible 具有自定义文本表示形式的类型。
  • protocol LosslessStringConvertible 可以以无损,明确的方式表示为字符串的类型。
  • protocol CustomDebugStringConvertible 具有适合调试目的的自定义文本表示形式的类型。

4、原始数据类协议

  • protocol CaseIterable 提供所有值的集合的类型。
  • protocol RawRepresentable 可以与相关原始值之间进行转换的类型。

5、可编解码的协议

  • protocol Encodable 可以将自身编码为外部表示形式的类型。
  • protocol Decodable 一种可以从外部表示形式进行解码的类型。
  • protocol CodingKey 可用作编码和解码键的类型。

6、编码器和解码器

  • protocol Encoder 可以将值编码为本机格式以用于外部表示的一种类型。
  • protocol Decoder 一种可以将值从本机格式解码为内存表示形式的类型。

7、编码容器协议

  • protocol SingleValueEncodingContainer 一个可以支持单个非键值的存储和直接编码的容器。
  • protocol KeyedEncodingContainerProtocol 一种类型,可提供对编码器存储的视图,并用于以键控方式保存可编码类型的编码属性。
  • protocol UnkeyedEncodingContainer 一种类型,可提供对编码器存储的视图,并用于按顺序保留可编码类型的编码属性,而无需键。

8、解码容器协议

  • protocol SingleValueDecodingContainer 一个可以支持单个非键值的存储和直接解码的容器。
  • protocol KeyedDecodingContainerProtocol 一种类型,可提供对解码器存储的视图,并用于以键控方式保存可解码类型的编码属性。
  • protocol UnkeyedDecodingContainer 一种类型,可提供对解码器存储的视图,并用于按顺序保持可解码类型的编码属性,而无需密钥。

9、文字编码

  • protocol ExpressibleByArrayLiteral 可以使用数组文字初始化的类型。
  • protocol ExpressibleByDictionaryLiteral 可以使用字典文字初始化的类型。

10、文字变量

  • protocol ExpressibleByIntegerLiteral 可以使用整数文字量初始化的类型。
  • protocol ExpressibleByFloatLiteral 可以使用浮点文字初始化的类型。
  • protocol ExpressibleByBooleanLiteral 可以使用布尔文字true和初始化的类型false。
  • protocol ExpressibleByNilLiteral 可以使用nil文字初始化的类型nil。 

11、文字字符串

  • protocol ExpressibleByStringLiteral 可以使用字符串文字初始化的类型。
  • protocol ExpressibleByExtendedGraphemeClusterLiteral 可以使用包含单个扩展字素簇的字符串文字初始化的类型。
  • protocol ExpressibleByUnicodeScalarLiteral 可以使用包含单个Unicode标量值的字符串文字初始化的类型。
  • protocol ExpressibleByStringInterpolation 可以通过使用包含表达式的字符串文字的字符串插值来初始化的类型。
  • protocol StringInterpolationProtocol 在构建字符串时,使用插值表示字符串文字的内容。
  • struct DefaultStringInterpolation 在构建字符串时,使用插值表示字符串文字。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:http://www.neter8.com/ios/105.html
标签:协议protocolswiftKwok最后编辑于:2021-05-12 11:12:41
0
感谢打赏!

《【进阶篇】1 协议(protocol)的定义与使用及常用的系统协议》的网友评论(0)

本站推荐阅读

热门点击文章