Swift泛型函数参数能否同时添加类与协议双重约束?
在Swift泛型中同时约束子类和协议实现
当然可以同时要求泛型参数是某个类的子类并且实现指定协议!Swift 4.0及以后版本支持直接用&符号来组合这两种约束,非常直观。
具体实现方式
有两种常用写法,效果完全一致,你可以根据习惯选择:
写法1:直接在泛型参数中组合约束
把类约束放在最前面,后面用&连接协议约束(多个协议也可以继续用&追加):
// 先定义基类和协议 class BaseClass { func baseFunction() { print("调用基类方法") } } protocol RequiredProtocol { func protocolFunction() } // 泛型函数同时约束子类和协议 func handleItem<T: BaseClass & RequiredProtocol>(_ item: T) { item.baseFunction() // 可以安全调用基类方法 item.protocolFunction() // 可以安全调用协议方法 } // 符合约束的子类 class ConformingClass: BaseClass, RequiredProtocol { func protocolFunction() { print("实现协议方法") } } // 调用示例 let example = ConformingClass() handleItem(example)
写法2:使用where子句
如果泛型参数的约束比较复杂,也可以用where子句来分开声明:
func handleItem<T>(_ item: T) where T: BaseClass, T: RequiredProtocol { item.baseFunction() item.protocolFunction() }
注意事项
- 类约束必须放在
&的最前面,因为Swift不支持多继承,一个类型只能有一个直接父类,协议约束可以有多个,依次用&连接即可。 - 如果你尝试把协议放在类前面(比如
T: RequiredProtocol & BaseClass),编译器会直接报错,这点要注意。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

