Это то, что я пытаюсь выполнить:
Я не знаю, как лучше всего это сделать, я так потерян! Могу ли я каким-то образом вернуть переменную «параметры» из функции, чтобы я мог изменить ее и отправить с помощью другой функции?
Приведенный ниже код не является полным кодом, я удалил большую часть, чтобы его было легче читать. Он содержит функцию «получить», не знаю, куда идти дальше.
Спасибо за проверку, просто ищу кого-то, кто укажет мне правильное направление.
import UIKit
import AVFoundation
import QRCodeReader
import Alamofire
// MARK: - Main
struct Main: Codable {
let objects: [Object]
}
// MARK: - Object
struct Object: Codable {
let inventory: [Inventory]
}
// MARK: - Inventory
struct Inventory: Codable {
let coordinates: String
}
func test() {
// MARK: - LOGIN DETAILS
let headers: HTTPHeaders = [
.authorization(username: "username", password: "password"),
.accept("application/json")]
// MARK: - API REQUEST
AF.request("URL LINK", headers: headers).validate().responseJSON { response in
// MARK: - CHECK FOR ERRORS
if let error = response.error {
print(error)
// MARK: - ERROR MESSAGE
DispatchQueue.main.async
{ let alert = UIAlertController(title: "ERROR", message: "Something went wrong", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true)}
return}
// MARK: - PRINT RESPONSE
if response.response != nil
{print (response.response!) }
// MARK: - PRINT DATA
if response.data != nil
{ print(response.data!)
let decoder = JSONDecoder()
do
{
let api = try decoder.decode(Main.self, from: response.data!)
let parameters = [
"meta": [
"language": "en"
],
"request": [
"inventory": [
[
"id": 6534206,
"warehouseid": 1,
"instock": 3,
"threshold": 0,
"reserved": 0,
"coordinates": "\(api.objects[0].inventory[0].coordinates)",
"note": "",
"prodno": 25669,
"soldout": 0
]
]
]
]
}
catch {
print("Error in JSON parsing")
}
}
}
}
Вы можете использовать замыкание, чтобы вернуть значение из функции. Эта практика является функциональным программированием, почти с использованием асинхронной функции.
func test(completion: ([String: AnyObject]) -> ()) {
...
let param = [“meta”: [“language”: “en”],...]
completion(param)
}
И затем, чтобы использовать его:
test(completion: { param in
// handle the “param”
})
Давайте попробуем func test(completion: ([String: Any]) -> ()) { ... }. Вы можете изменить [String: Any] на тип значения ответа, которое вы хотите получить за пределами этой функции @Axxi.
Привет! Это сработало, но это не совсем то, что я искал. Я хочу, чтобы одна кнопка "получала" данные, а другая - "помещала" данные (но измененные). Обработчик завершения делает эту работу, если я использую только 1 кнопку, но мне нужно 2 кнопки, как мне это сделать?
Вам нужно сохранить параметр как локальную переменную класса. Например: у вас есть ViewControllerA, он содержит 2 кнопки. Первая кнопка вызовет test(), а затем получит параметр, назначит его существующей локальной переменной, которую вы только что определили. Затем кнопка 2 будет использовать эту локальную переменную
Определите что-то подобное в своем классе: private var paramData: [String: Any]? = ноль. В завершении test() просто присвойте ему параметр: paramData = param
Спасибо бро, сработало. Я очень ценю время, которое вы потратили, чтобы помочь мне <3
Привет! Спасибо, что нашли время, чтобы помочь мне. Я пробовал приведенный выше код, но получаю следующую ошибку при вводе «completion (param) ---- Не удается преобразовать значение типа «[String: [String: Any]]» в ожидаемый тип аргумента «[String: AnyObject]» , как я могу решить эту проблему?