【问题标题】:Swift. How to return a function from a closure迅速。如何从闭包中返回函数
【发布时间】:2021-05-07 06:51:05
【问题描述】:

我有一个关于关闭的问题

function AA(){
     localPlayer.authenticateHandler{
       //…
       if trigger {
           retrun
       }
     }

     dosomething()
}

在上面的代码中, 我想编写一个代码,当异步回调调用的authenticateHandler闭包中满足trigger时返回AA()函数。

上面代码的结果是 当trigger发生时,只返回闭包,下面执行dosomething()方法。

有什么办法吗 我的英语水平不高,但感谢您的帮助。

【问题讨论】:

  • 那么你只是想在触发器为真之后执行dosomething(),还是你想在函数AA中等待直到触发器为true?如果触发器永远不会变成true,会发生什么?
  • 1.我想在localPlayer.authenticateHandler 等待,直到触发为true 2. 调用函数dosomething()

标签: ios swift closures


【解决方案1】:

闭包不支持return语句。而是在主线程中使用完成块来执行任务:

function AA( completion: @escaping (Result<[Return Type], Error>) -> Void) {
    localPlayer.authenticateHandler{
        //…
        if trigger {
            DispatchQueue.main.async {
                completion(//Whatever Return Value)
            }
        }
        dosomething()
    }
}

【讨论】:

  • 闭包确实支持返回语句,但它们从闭包返回,而不是从包含方法返回。
【解决方案2】:

闭包不支持return语句。

这样做。 这里我使用字符串比较来展示完成块是如何工作的。

    func call() {
        compareString(str1: "hey", str2: "hey") { isMatch in
            if isMatch! { //Trigger
                self.doSomething()
            }
        }
    }
    
    func compareString(str1:String,str2:String,completion:@escaping ((Bool?) -> Void)) {
        if str1 == str2 {
            completion(true)
        }else {
            completion(false)
        }
    }
    
    func doSomething() {
        
    }

【讨论】:

    【解决方案3】:

    这样不行。同步函数不能等待异步函数的结果。给 AA 一个回调闭包,并在 authenticateHandler 返回时调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2017-03-15
      相关资源
      最近更新 更多