попробуйте это:
, как я написал в комментарии - вы должны знать, какие вызовы asyn c, а какие syn c. Я надеюсь, что вы знаете, что такое syn c и asyn c звонки - если нет, пожалуйста, Google для этого. если да: вызов задачи data имеет тип asyn c и поэтому возвращает значение resp = 0. Через некоторое время, когда urlrequest готов, он продолжает в этой строке: «{(data, response, error) in», но здесь он больше не может возвращать значение, потому что метод уже вернул значение. Таким образом, с шаблоном завершения вы можете быть уверены, что вам позвонят, когда вызов asyn c будет готов.
struct ContentView: View {
@State var resp:Int = 0
var body: some View {
VStack{
Text("Hello, World!")
Button(action: {
postAdd() { response in
self.resp = response
print("view\(self.resp)")
}
}) {
Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
.background(self.resp == 201 ? Color.green : Color.gray)
}
}
}
}
func postAdd(completion:@escaping(Int)->()) {
let url = URL(string: "http://localhost:3000/user")
var request = URLRequest(url: url!)
request.httpMethod = "POST"
let urlstr = "id=5&name=aaa"
request.httpBody = urlstr.data(using: .utf8)!
let session = URLSession.shared
session.dataTask(with: request) { (data, response, error) in
if error == nil, let data = data, let response = response as? HTTPURLResponse {
print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")
print("statusCode: \(response.statusCode)")
completion(response.statusCode)
print(String(data: data, encoding: .utf8) ?? "")
} else {
completion(404)
}
}.resume()
}