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

Swift:如何将函数作为参数传入函数并在ViewController中调用?

解决方案

错误原因

你误用了泛型参数T,泛型是用来抽象类型而非直接指代方法成员的,所以编译器会提示FeedViewController没有名为T的成员。正确的做法是直接将函数/闭包作为参数传入,而非用泛型包装。

正确实现方式

1. 修改addSwipeControllerLeft函数,接收闭包参数

将函数参数定义为@escaping () -> Void类型(如果需要访问self的上下文,可以调整闭包参数):

func addSwipeControllerLeft(with actionHandler: @escaping () -> Void) {
    let action = UIContextualAction(style: .normal, title: "自定义操作") { _, _, completion in
        // 直接调用传入的闭包
        actionHandler()
        completion(true)
    }
    
    // 配置action的样式(示例)
    action.backgroundColor = .systemBlue
    action.image = UIImage(systemName: "checkmark")
    
    // 生成swipe配置并返回(假设是UITableView场景)
    let swipeConfig = UISwipeActionsConfiguration(actions: [action])
    // 如果是在tableView的代理方法中,直接返回swipeConfig即可
}

2. 调用函数时传入目标方法

直接将你需要执行的方法作为参数传入:

// 调用收藏逻辑
addSwipeControllerLeft(with: handleMarkAsFavourite)

// 调用其他操作(比如删除)
func handleDeleteItem() {
    // 你的删除逻辑
}
addSwipeControllerLeft(with: handleDeleteItem)

3. 需要访问self上下文的场景

如果你的操作需要依赖FeedViewController的属性或方法,可以调整闭包参数,让它接收self的弱引用:

func addSwipeControllerLeft(with actionHandler: @escaping (FeedViewController?) -> Void) {
    let action = UIContextualAction(style: .normal, title: "操作") { [weak self] _, _, completion in
        // 将self传入闭包
        actionHandler(self)
        completion(true)
    }
    // 其他配置...
}

// 调用时直接在闭包里处理逻辑
addSwipeControllerLeft { [weak self] vc in
    vc?.handleMarkAsFavourite()
    // 也可以直接写业务逻辑,比如修改vc的属性
    vc?.currentSelectedItem = nil
}

内容的提问来源于stack exchange,提问作者Jemal baghasvili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:10:54