Swift中如何区分不同泛型参数各自的用途?
Swift 泛型参数用途区分逻辑与示例解析
要区分泛型参数的用途,核心不需要死记命名,只需要看两个维度:泛型参数在函数/类型上绑定的位置,以及Swift社区的通用命名约定即可。
通用区分方法
- 第一优先级看绑定位置:哪个入参、关联值、返回值用了该泛型参数,它就对应该位置的类型约束,所有用到同一个泛型参数的位置类型必须保持一致,这也是Swift泛型类型安全的核心。
- 第二优先级看命名约定:Swift社区有通用的泛型命名习惯,比如
T是Type的缩写,一般指代任意通用值类型;E是Error的缩写,一般指代错误类型;R是Return的缩写,一般指代返回值类型,这类约定只是降低阅读成本,不强制遵守。
示例代码中T和E的具体作用
你提供的代码是对空合运算符??的自定义重载,用来给Result类型提供错误 fallback 能力,两个泛型参数的作用分别是:
T 泛型参数
它是Result类型的成功关联值的类型,绑定了三个位置的类型:
Result<T, E>的.success关联值类型handleError闭包的返回值类型- 整个重载函数的返回值类型
作用是保证「成功时返回的结果值」和「出错后闭包返回的兜底值」类型完全一致,编译期就能规避类型不匹配的问题。
E 泛型参数
它是Result类型的失败关联值的类型,绑定了两个位置的类型:
Result<T, E>的.failure关联值类型handleError闭包的入参类型
作用是自动匹配Result的错误类型,把错误值直接透传给处理闭包,不需要开发者手动做类型转换。
你可以参考下面的实际调用案例更直观的理解:
// 自定义错误类型 enum ParseError: Error { case invalidContent } // 生成一个失败的Result实例,这里T为String,E为ParseError let parseResult: Result<String, ParseError> = .failure(.invalidContent) // 调用重载的??运算符 let finalContent = parseResult ?? { error in print("解析失败,错误:\(error),返回默认内容") return "默认内容" }
注意:你完全可以把泛型参数的名字换成SuccessType、FailureError这类自定义命名,函数的功能不会有任何变化,T、E只是社区通用的简洁命名约定。
内容的提问来源于stack exchange,提问作者Nighthawk
相关产品推荐
相关产品推荐

