Swift中的Protocol是否等同于TypeScript中的extend?
关于Swift Protocol与TypeScript扩展类的理解校正
我目前正在学习Swift语言,接触到protocols(协议)这一特性。在我看来它类似于TypeScript中可通过extend进行扩展的预构建类,想确认该理解是否准确。
提问者:Pascal
结论
这个理解不准确,Swift的protocol本质更接近TypeScript的interface,和你说的「可extend扩展的预构建类」是完全不同的东西。
核心差异点
- 本质属性不同:protocol只是一份规则约定清单,本身不具备实例化能力,你永远不能直接通过协议创建实例;它只会要求所有遵循它的类型(类、结构体、枚举都可以遵循协议)实现清单里要求的属性、方法、下标或初始化器。而TS里可被extend的预构建类是有完整实现逻辑的具体类型,可以直接实例化,两者底层定位完全不一样。
- 扩展能力的归属不同:你提到的extend扩展能力在Swift里不是类独有的:你既可以给已有类、结构体、枚举写扩展,也可以直接给protocol写扩展,给协议里的方法提供默认实现——所有遵循这个协议的类型不用重复写代码,就能直接使用这套默认实现,这个特性是TS的interface本身不具备的,也和类继承的扩展逻辑不一样:协议扩展的默认实现是所有遵循者通用的,不需要走继承链。
- 适用范围不同:Swift的protocol可以作为独立的类型使用(也就是存在类型),用来声明变量、函数参数、返回值,不需要绑定到某个具体的类继承体系;结构体、枚举等值类型也能遵循协议,这点是单继承体系下的类做不到的。
直观代码对比
你可以通过两段简单代码看出本质区别:
Swift 协议示例
// 仅定义规则,无具体实现、无法实例化 protocol Describable { var description: String { get } } // 给协议扩展默认实现 extension Describable { var description: String { "默认描述内容" } } // 结构体不需要手动实现description,直接用协议默认实现 struct Article: Describable {} let article = Article() print(article.description) // 输出:默认描述内容 // 注意:这里直接写 let invalid = Describable() 会直接报错,协议不能实例化
TypeScript 可扩展预构建类示例
// 预构建类是有具体实现的具体类型,可以直接实例化 class PreBuiltComponent { description: string = "类内置的描述内容" } // 通过extend继承扩展类能力 class MyComponent extends PreBuiltComponent {} const com = new MyComponent() console.log(com.description) // 输出:类内置的描述内容 // 这里直接写 const ins = new PreBuiltComponent() 是完全合法的
最容易记的判断标准:能不能直接
new出来用,是协议和类最直观的区分边界。
内容的提问来源于stack exchange,提问作者Programmer Developement
相关产品推荐
相关产品推荐

