如何将参数传递给快速完成的函数
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没有错。这称为“尾随闭包语法”,其中当最后一个参数是闭包时,您跳过其上的参数标签,并将大括号放在括号外。这是一种非常常见的调用函数的方法,该函数将完成处理程序作为其最后一个参数。以上是关于如何将参数传递给快速完成的函数的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有 args 的成员函数作为参数传递给另一个成员函数?