如何将运算符作为函数参数传入?(以逻辑运算符为例)
实现把逻辑运算符作为函数参数传入
嘿,这个需求很实用,想让你的函数更灵活通用对吧?在Swift里,我们可以借助闭包来实现这个效果——因为你想用的这些逻辑运算符,本质上本身就是函数!
基础实现方案
首先,我们需要把函数的运算符参数定义成一个闭包,它的类型要匹配你比较操作的输入和输出:比如你要比较两个Int类型的值,返回布尔值,那闭包类型就是(Int, Int) -> Bool。
修改后的函数定义如下:
// 假设lastTab是你的类/结构体里的Int属性 var lastTab: Int = 0 func openViewIfNeeded(compare: (Int, Int) -> Bool) { if compare(lastTab, 0) { openView() } }
然后调用的时候,直接把运算符传进去就行——Swift允许直接将运算符作为函数传递:
// 当lastTab不等于0时打开视图 self.openViewIfNeeded(compare: !=) // 当lastTab等于0时打开视图 self.openViewIfNeeded(compare: ==)
进阶:泛型让函数更通用
如果你的lastTab可能是其他可比类型(比如String、Double),或者想灵活指定比较的目标值,我们可以用泛型来扩展函数的能力:
func openViewIfNeeded<T: Comparable>(compare: (T, T) -> Bool, targetValue: T) { if compare(lastTab, targetValue) { openView() } }
这样调用的时候就更灵活了:
// 比较lastTab是否不等于0 self.openViewIfNeeded(compare: !=, targetValue: 0) // 比较lastTab是否大于5 self.openViewIfNeeded(compare: >, targetValue: 5) // 如果lastTab是String类型,还可以比较是否等于"home" self.openViewIfNeeded(compare: ==, targetValue: "home")
为什么这样可行?
其实Swift里的!=、==、>这些运算符,本质上都是全局函数。比如针对Int的不等于运算符,它的定义大概是这样的:
func !=(lhs: Int, rhs: Int) -> Bool { // 内部实现逻辑 }
所以我们完全可以把它当作一个普通函数,传递给接受对应闭包类型的参数。
内容的提问来源于stack exchange,提问作者Birju
相关产品推荐
相关产品推荐

