You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将运算符作为函数参数传入?(以逻辑运算符为例)

实现把逻辑运算符作为函数参数传入

嘿,这个需求很实用,想让你的函数更灵活通用对吧?在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:50:43