Swift中如何检查运算符的同一性(Operator Identity Check)
解决Swift中运算符同一性判断的问题
这个问题确实挺挠头的——Swift里运算符本质是多态的,直接用===去比较会因为类型模糊而失败,毕竟同一个运算符在不同类型上有不同的实现嘛。不过我们可以通过显式绑定运算符到具体的函数类型来解决这个问题,具体步骤和示例如下:
核心思路
Swift允许我们把运算符当作函数来使用,但必须明确指定它对应的函数类型(比如针对Int类型的加减,函数类型是(Int, Int) -> Int)。一旦我们把运算符转换为明确类型的函数引用,就可以用===来判断它的同一性了。
示例代码
// 定义一个函数,根据传入的运算符返回reduce对应的初始值 func reduceInitialValue(for operation: (Int, Int) -> Int) -> Int { // 显式将+、-运算符绑定到Int类型的函数类型上 let intAddition: (Int, Int) -> Int = (+) let intSubtraction: (Int, Int) -> Int = (-) // 现在可以用===判断函数引用的同一性了 switch operation { case intAddition: return 0 case intSubtraction: return 1 default: fatalError("只支持+和-运算符") } } // 测试示例 let numbers = [1, 2, 3] // 使用加法reduce,初始值0 let sum = numbers.reduce(reduceInitialValue(for: (+)), (+)) print(sum) // 输出6 // 使用减法reduce,初始值1 let difference = numbers.reduce(reduceInitialValue(for: (-)), (-)) print(difference) // 输出1 - 1 - 2 - 3 = -5
补充说明
- 如果你的运算符需要处理其他数值类型(比如
Double),只需要把函数类型改成对应的(Double, Double) -> Double,绑定运算符时也用对应类型即可,原理完全一致。 - 这种方法的关键是明确函数类型,让Swift能确定我们要引用的是运算符的哪一个具体实现,这样才能生成可比较的函数引用。
内容的提问来源于stack exchange,提问作者Noah Wilder
相关产品推荐
相关产品推荐

