【问题标题】:How to pass parameter to a escaping function that calls escaping function in swift?如何将参数传递给快速调用转义函数的转义函数?
【发布时间】:2021-09-20 20:23:39
【问题描述】:
func fetchParseNSyncJson2(parseNSyncFunction: @escaping(String)->Void) {
    if 200 == 200 {
        print("Got the json")
        parseNSyncFunction("The json data")
    }
}

func parseNSync2(jsonDictionary: String) {
    print("Parsed the data: \(jsonDictionary)")
}

fetchParseNSyncJson2(parseNSyncFunction: parseNSync2(jsonDictionary:))

上面的代码工作正常,但我想向 parseNSync2 函数添加另一个参数来转义闭包块,就像这样

func parseNSync2(jsonDictionary: String, done: @escaping(Bool)->Void {
    print("Parsed the data: \(jsonDictionary)")
}

然后我想像上面那样在 fetchParseNSyncJson2 函数中传递这个新函数带有转义块我该怎么做??

这是我尝试过的(注意:下面的代码包含错误)

func fetchParseNSyncJson(parseNSyncFunction: (json: String, done: (Bool)->Void)) {
    if 200 == 200 {
        print("got the json")
        
        parseNSyncFunction(json: "json data", done: (_:)) // how should i pass parameter here??
    }
}

func parseNSync(_ jsonDictionary: String, done: @escaping (Bool)->Void) {
    print("Parsed: \(jsonDictionary)")
}

fetchParseNSyncJson(parseNSyncFunction: parseNSync(json:, done: { done in // how to i pass parameter here
                                                        if done {
                                                            print("Done")
                                                        }
}))

【问题讨论】:

  • 不清楚你在问什么。你想传递什么参数?也许您可以重写您的问题以使用更简单和更独特的函数名称。正如所写的那样,很难理解。由于闭包正在转义,因此您无法避免转义参数。
  • 好的,我该如何通过呢?
  • 通过什么?我无法理解您的问题是什么
  • 传递转义参数即:done, func parseNSync2(jsonDictionary: String, done: @escaping(Bool)->Void { print("Parsed the data: (jsonDictionary)") } 我想在 fetchParseNSyncJson2 函数中传递这个。请检查示例代码。
  • 重复同样的事情没有帮助。什么参数? done 关闭?它只是称为done。你的意思是done(true)

标签: ios swift function escaping closures


【解决方案1】:

这是你可以尝试的 -

import Foundation

typealias DoneBlock = ((_ success: Bool) -> Void)
typealias ParseNSyncBlock = ((_ json: String, _ done: @escaping DoneBlock) -> Void)

func fetchParseNSyncJson(parseNSyncBlock: @escaping ParseNSyncBlock) {
    if 200 == 200 {
        print("got the json")
        parseNSyncBlock("the json", { success in
            print("success : \(success)")
        })
    }
}
func parseNSync(_ json: String, _ done: @escaping DoneBlock) {
    print("Parsed: \(json)")
    done(true)
}

fetchParseNSyncJson(parseNSyncBlock: parseNSync)

输出

got the json
Parsed: the json
success : true

【讨论】:

  • fetchParseNSyncJson(parseNSyncBlock: parseNSync(_:, _: { success in if success { } } )) 是否可以在外部定义完成块??在呼叫地点?
  • 您只能在函数的调用点定义完成块体,当您实际调用/调用函数时。在答案中,当您将 parseNSync 函数作为参数传递时,您不是在这里调用它,而是从接受它的函数内部调用它。所以你的问题的答案是“否”。在使用你想要的函数引用时,你不能这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2022-01-19
相关资源
最近更新 更多