如何将参数传递给快速完成的函数

Posted

技术标签:

【中文标题】如何将参数传递给快速完成的函数【英文标题】:How to pass arguments into a function with completion swift 【发布时间】:2021-02-01 20:51:54 【问题描述】:

我是 swift 新手,想知道如何在函数完成时将参数传递给函数。我尝试只传入一个变量 String 但这不起作用。这是我处理 api 请求的类。这是我需要将内容传递到的地方,以便它可以将其添加到搜索字段并返回结果。

public class API 
    
    func apiRequest(search: String, completion: @escaping (Result) -> ()) 
        
        //URL
        var query = search.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        let url = URL(string: "https://calorieninjas.p.rapidapi.com/v1/nutrition?query=" + query!)
        
        //URL REQUEST
        var request = URLRequest(url: url!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
        
        //Specify header
        let headers = [
            "x-rapidapi-key": "3be44a36b7msh4d4738910c1ca4dp1c2825jsn96bcc44c2b19",
            "x-rapidapi-host": "calorieninjas.p.rapidapi.com"
        ]
        
        request.httpMethod="GET"
        request.allHTTPHeaderFields = headers
        
        //Get the URLSession
        let session = URLSession.shared
        
        //Create data task
        let dataTask = session.dataTask(with: request)  (data, response, error) in
            
            let result = try? JSONDecoder().decode(Result.self, from: data!)
            print(result)
            DispatchQueue.main.async 
                completion(result!)
            
             
            
        
        
        //Fire off data task
        dataTask.resume()
        
    

这是我的内容视图代码,我试图将文本框的内容传递给此函数,以便我可以从 api 获取结果:

struct ContentView: View 
    
    @State var result = Result()
    @State private var searchItem: String = ""
    
    var body: some View 
        ZStack(alignment: .top) 
            Rectangle()
                .fill(Color.myPurple)
                .ignoresSafeArea(.all)
            VStack 
                TextField("Enter food", text: $searchItem)
                    .background(Color.white)
                    .padding()
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                
                SearchButton()
                    .padding(.top)
                    .onTapGesture 
                        API().apiRequest  (result) in //IDEALLY I WOULD LIKE TO PASS IN THE CONTENTS OF THE TEXT BOX HERE INTO apiRequest
                            self.result = result
                        
                    
                
            
        
    

我确信解决方案很简单,我只是不习惯这种语法,但非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

您的函数“apiRequest”有 2 个参数:

    搜索:字符串(此参数需要字符串) 完成:@escaping(结果)->()

所以当你调用这个方法时,你也会传递这两个参数,像这样:

.onTapGesture 
    API().apiRequest(search: "String you want to pass", completion:  (result) in
        self.result = result
    )
 

了解闭包,因为这个完成参数也是闭包的一种(转义闭包)。

【讨论】:

谢谢,我忘记了完成也是一个参数,所以它们都被传入我试图做 apiRequest(search: "...") 这是错误的。感谢您的帮助! 其实你以apiRequest(search: "…") 的形式调用apiRequest没有错。这称为“尾随闭包语法”,其中当最后一个参数是闭包时,您跳过其上的参数标签,并将大括号放在括号外。这是一种非常常见的调用函数的方法,该函数将完成处理程序作为其最后一个参数。

以上是关于如何将参数传递给快速完成的函数的主要内容,如果未能解决你的问题,请参考以下文章

将一个函数的所有参数传递给另一个函数

jQuery UI 问题。如何将参数传递给函数

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

如何使用 SwiftUI 将参数传递给 Button 的操作

如何迭代地将参数传递给 R 函数

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?