[swift 进阶]读书笔记-第十章:协议 C10P2 协议的两种类型 TwoTypesofProtocols

第十章:协议 Protocol Protocol-Oriented Programming

10.2 协议的两种类型 TwoTypesofProtocols

这一节主要介绍了协议的两种类型带有关联类型的协议普通的协议,还引入了一个新的概念类型抹消

什么是带有关联类型的协议:

class 的范型类型参数写法

class Person { ... }

protocol 和 class、struct 以及 enum 不同,它不支持范型类型参数。取而代之的是支持抽象类型成员;称作关联类型

这样单纯的讲的确有些抽象,其实你在playGround中把下面的demo写一遍就知道很简单的

关联类型就是可以使你在协议方法中的参数类型保存一致。

带有关联类型的协议的使用场景

有时候会遇到这样的需求,继承自某一协议的类中需要保证代理方法处理的参数类型保持一致
我们可以联想UITableView的代理来记忆关联类型的使用场景

协议声明:

protocol ATypeDelegate {
    /// 关联类型的协议需要你去手动写associatedtype  创建系统提供的关联类型 T  
    associatedtype T
    /// 自定义函数的参数是
    func printContent( ct : T)

    func colum( ct : T)

}

协议使用:

class ATypeClass: ATypeDelegate {
    ///只要遵守了ATypeDelegate协议 系统会自动补全 typealias T = "你指定的类型"
    typealias T = Int

    func printContent(ct: Int) {
        print("Int",#function)

    }

    

    func colum(ct: Int) {

        print("Int",#function)

    }
}

ATypeClass 继承自ATypeDelegate,必须在ATypeClass类中定义 T 的具体类型才能使用

let a = ATypeClass()
a.printContent(ct: 888)
a.colum(ct: 999)
//Int printContent(ct:)
//Int colum(ct:)

类型抹消:

定义和使用场景

所谓类型抹消就是不将某实例的真实类型暴露出去,对外只暴露一个必要的类型

举例
当我们编写一个class或者struct并实现了一个协议,当我们对外提供该实例时,只想让外界知道这个东西实现了该协议,可是又不想让外界知道实现了这个协议的class或者struct是哪一个类型的,这时我们就需要用到类型抹消

使用方法:
这里推荐swiftgg翻译组的Swift 类型擦除 一文,这里对类型抹消的理解和使用有一个很全面的介绍。

小知识点:

在上一节中我们可以写出

var context: Drawing = SVG()

这里将 Drawing协议 作为一个类型来使用。

当你的协议存在关联类型的协议就不能够像Drawing这样去使用,编译器会报错

文章源文件地址,大家如果有更好的想法和观点欢迎交流

你可能感兴趣的:([swift 进阶]读书笔记-第十章:协议 C10P2 协议的两种类型 TwoTypesofProtocols)