知识卡片
协议解耦接口与实现并可作为类型使用
内容
协议只声明一组类型必须提供的属性和方法(接口),不包含任何实现;任意类型——结构体、枚举、类——只要提供了协议要求的全部成员,就”符合”这个协议,无需与协议定义者有任何继承关系。协议的关键威力在于它本身可以当作类型使用:函数参数、变量都能声明为协议类型(如func printTable(_ dataSource: TabularDataSource)),函数内部只依赖协议定义的接口,完全不知道调用方传进来的具体是Department还是其他任何符合该协议的类型。这让”打印表格”这个通用能力和”数据从哪来”彻底解耦——新增一种数据源只需让它符合协议,不需要改printTable一行代码。发散:这正是依赖倒置原则(面向接口而非具体实现编程)在Swift里最自然的落地方式,协议扮演的角色等价于其他语言里的interface。
参考来源
《Swift编程权威指南》第19章《协议》