Swift协议扩展使用where子句无法让Comparable类型遵循协议怎么修复
报错原因
你当前编写的扩展语法extension Ordered where Self: Comparable的作用是:给已经遵循Ordered协议、且同时符合Comparable约束的类型提供precedes方法的默认实现,没有声明所有Comparable类型要遵循Ordered协议,因此Int等默认遵循Comparable的系统类型,仍然不满足binarySearch要求的T: Ordered泛型约束,所以编译报错。
修复方案
方案1:保留Ordered协议,声明所有Comparable类型自动遵循Ordered
仅需在你现有代码的基础上,添加1行声明即可:
protocol Ordered { func precedes(other: Self) -> Bool } func binarySearch<T: Ordered>(sortedKeys: [T], forKey k: T) -> Int { 11 } // 新增这一行:声明所有Comparable类型都遵循Ordered协议 extension Comparable: Ordered {} // 你原有给Comparable类型的Ordered默认实现保持不变 extension Ordered where Self: Comparable { func precedes(other: Self) -> Bool { return self < other } } // 此时编译正常 let position = binarySearch(sortedKeys: [2, 3, 5, 7], forKey: 5)
这种方案的优势是可以保留Ordered协议的设计,后续非Comparable的自定义类型也可以手动遵循Ordered协议适配二分查找逻辑。
方案2:简化设计,直接用Comparable约束替换Ordered协议
如果你的Ordered协议仅用来做大小对比、没有其他扩展用途,可以直接删除协议,简化二分查找的泛型约束,代码更精简:
// 无需自定义Ordered协议,直接用系统原生Comparable约束 func binarySearch<T: Comparable>(sortedKeys: [T], forKey k: T) -> Int { 11 } // 编译正常 let position = binarySearch(sortedKeys: [2, 3, 5, 7], forKey: 5)
内容的提问来源于stack exchange,提问作者hopy
相关产品推荐
相关产品推荐

