【问题标题】:how to pass function in parameter using closure in swift 5 [closed]如何在swift 5中使用闭包在参数中传递函数[关闭]
【发布时间】:2021-09-27 11:21:41
【问题描述】:

我是 swift 新手。我已经制作了通用操作表

import Foundation
extension UIAlertController{
    func action(mes:String,tit:String,tit2:String,operation1:(),operation2:()) {
        
        let actionSheet = UIAlertController(title: "", message:mes, preferredStyle: .actionSheet)
        
        let EButton = UIAlertAction(title:tit ,
                                              style: .default,
                                              handler: { _ in
                                                operation1
 
                                                })
        
        let AllEButton = UIAlertAction(title:tit2,
                                                  style: .default ,
                                                  handler:{ _ in
                                                    operation2
                                
                                                    })
        
        let cancelAction = UIAlertAction(title: "Cancel",
                                         style: .cancel,
                                         handler: nil)

        
        [EButton, AllEButton, cancelAction].forEach { $0.setValue(UIColor.red, forKey: "titleTextColor")
        }
        
        
        actionSheet.addAction(EButton)
        actionSheet.addAction(AllEButton)
        actionSheet.addAction(cancelAction)
        
        present(actionSheet, animated: true, completion: nil)
    }
}

我想从 viewControllerA 调用这个扩展

let actionView = UIAlertController()

    class viewControllerA: UIViewController {}
   
 private extension viewControllerA {
    func alertBottomSheat()  {
    actionView.action(mes: "Update",tit: "Update only",tit2: "Update All", operation1:saveEvent(),operation2:saveEvent())
    }
 @IBAction func deleteEventButtonClicked(_ sender: Any) {
actionView.action(mes: "delete ",tit: "Delete only",tit2: "Delete All ",operation1:deleteEvent(),operation2:deleteEvent(deleteAll: true))

}
}

Q1- 我是从 viewControllerA 扩展中调用扩展的正确方法吗?

Q2-请告诉我如何在这一行使用闭包来传递函数参数?

actionView.action(mes: "delete ",tit: "Delete only",tit2: "Delete All ",operation1:deleteEvent(),operation2:deleteEvent(deleteAll: true))

以及如何在这一行的操作表处理程序中使用闭包

let EButton = UIAlertAction(title:tit ,
                                          style: .default,
                                          handler: { _ in
                                            operation1

                                            })

【问题讨论】:

    标签: ios swift xcode generics completionhandler


    【解决方案1】:

    您首先需要为 UIViewController 而不是 UIAlertController 创建一个扩展

    另外,为函数设置正确的闭包参数,然后像这样调用函数。

    extension UIViewController {
        
        func action(message: String, firstTitle: String, secondTitle: String, firstAction: (() -> Void)? = nil, secondAction: (() -> Void)? = nil) {
            
            let actionSheet = UIAlertController(title: "", message: message, preferredStyle: .actionSheet)
            
            let eButton = UIAlertAction(title: firstTitle ,
                                        style: .default,
                                        handler: {_ in firstAction?()})
            
            let allEButton = UIAlertAction(title: secondTitle,
                                           style: .default ,
                                           handler: {_ in secondAction?()})
            
            let cancelAction = UIAlertAction(title: "Cancel",
                                             style: .cancel,
                                             handler: nil)
            
            
            [eButton, allEButton, cancelAction].forEach { $0.setValue(UIColor.red, forKey: "titleTextColor")}
            
            
            actionSheet.addAction(eButton)
            actionSheet.addAction(allEButton)
            actionSheet.addAction(cancelAction)
            
            present(actionSheet, animated: true, completion: nil)
        }
    }
    

    用法

    private extension viewControllerA {
        func alertBottomSheat()  {
            self.action(message: "Update", firstTitle: "Update only", secondTitle: "Update All", firstAction: saveEvent, secondAction: saveEvent)
        }
        
        @IBAction func deleteEventButtonClicked(_ sender: Any) {
            self.action(message: "delete ", firstTitle: "Delete only", secondTitle: "Delete All ", firstAction: { self.deleteEvent()}, secondAction: { self.deleteEvent(deleteAll: true) })
            
        }
        
        func saveEvent() {
            
        }
        
        func deleteEvent(deleteAll: Bool = false) {
            
        }
    }
    

    注意:固定编码标准规则和变量名称。

    【讨论】:

    • 为什么我不应该使用 UIAlertController?为什么只使用 UIViewController?请解释一下
    • 不是不需要创建 UIAlertController 的对象,也不需要创建 UIAlertController 对象并在同一个 UIAlertController 对象上呈现警报控制器没有意义。
    猜你喜欢
    • 2020-11-06
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多