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
相关产品推荐
相关产品推荐

