美文网首页
[swift 进阶]读书笔记-第十章:协议 C10P2 协议的

[swift 进阶]读书笔记-第十章:协议 C10P2 协议的

作者: liaoworkinn | 来源:发表于2019-04-27 17:40 被阅读0次

    第十章:协议 Protocol Protocol-Oriented Programming

    10.2 协议的两种类型 TwoTypesofProtocols

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

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

    class 的范型类型参数写法

    class Person<T> { ... }
    

    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 协议的

          本文链接:https://www.haomeiwen.com/subject/siiknqtx.html