How to pass arguments into a function with completion swift(如何将参数传递给快速完成的函数)
问题描述
我是 swift 新手,想知道如何在函数完成时将参数传递给函数.我尝试只传入一个变量 String 但这不起作用.这是我处理 api 请求的类.这是我需要将内容传递到的地方,以便它可以将其添加到搜索字段并返回结果.
I'm new to swift and am wondering how I can pass arguments into a function when that function has a completion. I tried just passing in a variable String but that did not work. Here is my class for handling an api request. This is where i need to pass the contents to so that it can add it to a search field and return the results.
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 获取结果:
This is my content view code where I am trying to pass in the contents of a text box into this function so that i can get the result back from the 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
}
}
}
}
}
}
我确信解决方案很简单,我只是不习惯这种语法,但非常感谢任何帮助.
I'm sure the solution is simple I am just not used to the syntax and such of swift quite yet any help with this is much appreciated.
推荐答案
你的函数 'apiRequest' 有 2 个参数:
Your function 'apiRequest' has 2 parameters:
- 搜索:字符串(此参数需要字符串)
- 完成:@escaping(结果)->()
所以当你调用这个方法时,你也会传递这两个参数,像这样:
So when you call this method, you will pass these 2 parameters as well, like this:
.onTapGesture {
API().apiRequest(search: "String you want to pass", completion: { (result) in
self.result = result
})
}
了解闭包,因为这个完成参数也是闭包的一种(转义闭包).
这篇关于如何将参数传递给快速完成的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将参数传递给快速完成的函数
基础教程推荐
- Android:对话框关闭而不调用关闭 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01