【问题标题】:Array of closures in SwiftSwift 中的闭包数组
【发布时间】:2017-05-16 07:11:01
【问题描述】:

我有一个接受 Array 参数的函数。该数组将由各种闭包组成。如何获取闭包数组并在函数内访问该数组?

func showAlert(_ title: String, message: String, actions: [String], handler: [()->()]) -> Void {

}

Alertift.alert(title: "test",
                           message: "test")
                .action(.default("OK")) {

                }
               .action(.default("Cancel")) {

                }
                .show(on: self)

现在在我的函数中,我将接收到动作的数量和关联的处理程序或闭包的数量。现在如何使用数组将每个动作分配给闭包。

【问题讨论】:

  • 问题出在哪里?这只是一个常规数组,就像其他任何数组一样,通过handler[someIndex] 访问它并将该值分配给某物-
  • 您不想将此处理程序添加到 AlertController 吗?
  • @RohitaxRajguru alert(title:) 的返回类型是什么?
  • @NiravD 好吧,它只是 AlertController。是的,我正在尝试使用数组将处理程序添加到 AlertController 的操作中。 Alertift 只是一个第三方库。
  • @RohitaxRajguru 我想你想为 Ok 添加关闭并取消按钮操作,所以我猜 pratyush 的回答解决了你的目的

标签: ios swift generics swift3 closures


【解决方案1】:

在你的方法中访问闭包:

func showAlert(_ title: String, message: String, actions: [String], handler: [()->()]) -> Void {
    for closure in handler {
        closure()
    }
}

将您的方法与闭包数组一起使用:

showAlert("foo", message: "bar", actions: ["foo", "bar"], handler: [{
        print("foo")
        }, {
        print("bar")
        }
    ])

【讨论】:

    【解决方案2】:

    以下应该有效。因为我不想安装库,所以我没有对此进行全面测试,但无论如何你应该明白这一点:

    func showAlert(_ title: String, message: String, actions: [String], handler: [()->()]) -> Void {
        let alert = Alertift.alert(title: title, message: message)
        for (action, handler) in zip(actions, handler) {
            alert.action(.default(action), handler: handler)
        }
    }
    

    请注意,将Strings 与操作直接分组会更好:

    func showAlert(_ title: String, message: String, actionsAndHandlers: [(String, ()->())]) -> Void {
        let alert = Alertift.alert(title: title, message: message)
    actionsAndHandlers.forEach {
            alert.action(.default($0.0), handler: $0.1)
        }
    }
    

    【讨论】:

    • 你应该 zip 和一个元素迭代器来代替:for (action, handler) in zip(actions, handlers) { ...
    • @Alexander 在第一种情况下是不可能的。在第二种情况下,我个人有时更喜欢 foreach,但迭代器可能更具可读性。因此,感谢您的评论,我将把它留给 OP 来决定他使用什么感觉更好。
    • 为什么在第一种情况下不可能?有什么我想念的吗?
    • @Alexander 啊,您编辑了评论以使用zip,那么当然也有可能。在这种情况下,它肯定比处理索引更好。
    【解决方案3】:

    在 @RohitaxRajguru 的情况下,以下内容应适用于 Alertift v2.0 和 Swift 3。

    func showAlert(_ title: String, message: String, actions: [String], @escaping handler: [()->()]) -> Void {
        Alertift.alert(title: title, message: message)
            .actions(actions) { _, index, _ in
                handler[index]()
            }
            .show(on: self)
    }
    
    // ===============
    showAlert("Foo", messge: "bar bazz.", actions: ["A", "B", "C"], handler: [
        {
            print("A selected")
        },
        {
            print("B selected")
        },
        {
            print("C selected")
        }
    ])
    

    https://github.com/sgr-ksmt/Alertift

    【讨论】:

      【解决方案4】:

      我想你要实现的是这个,看看共享文件-

      drive

      import Foundation
      import UIKit
      
      class Alert {
      
          var okAction : AlertSuccess?
          typealias AlertSuccess = (()->())?
      
          public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) {
      
              let version : NSString = UIDevice.current.systemVersion as NSString
              if  version.doubleValue >= 8 {
                  let alert:UIAlertController = UIAlertController(title: title, message: message, preferredStyle:.alert)
                  alert.addAction(UIAlertAction(title: "OK".localized, style: .default, handler: { (action: UIAlertAction) in
      
                      if let okAction = okAction {
                          okAction()
                      }
                  }))
                  viewController?.present(alert, animated:true, completion:nil);
              }
          }
      
          public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) {
              let version:NSString = UIDevice.current.systemVersion as NSString;
      
              if  version.doubleValue >= 8 {
                  let alert:UIAlertController = UIAlertController(title: title, message: message, preferredStyle:.alert)
      
                  alert.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in
      
                      if let cancelAction = cancelAction {
                          cancelAction()
                      }
                  }))
                  alert.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in
      
                      if let okAction = okAction {
                          okAction()
                      }
                  }))
                  viewController?.present(alert, animated:true, completion:nil);
              }
          }
      }
      

      【讨论】:

      • 这是对某些访问受限站点的仅链接回答,请将实际内容发布在 SO 上而不是在其外部。
      • 其实他已经分享了代码,你有没有尝试打开链接,链接中包含一个swift文件,看看
      • @Mr.Bean 首先没关系,这是一个仅链接的答案,如果他删除文件,答案将毫无价值。其次,它要求我“请求访问”我不会做的文件。
      • @Mr.Bean 我重复一遍:没关系,这是一个仅链接的答案,是标记/删除答案的极少数硬标准之一。
      • 仍然没有使用数组。如果通常我想将所有闭包分组并访问它们怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多