【发布时间】:2019-07-19 10:55:12
【问题描述】:
我是一个完全的 swift 初学者。在遵循在线教程后,我成功地向我的 API 服务发出 POST 请求,但是,我现在希望将 LoginResponse 模型类中的值返回到 SwiftUI 视图结构,以便我可以更改状态变量的值.
模型类
// MARK: - LoginResponse
class LoginResponse: Codable {
let message, oauthToken, status: String
let userData: [UserDatum]
enum CodingKeys: String, CodingKey {
case message
case oauthToken = "oauth_token"
case status
case userData = "user_data"
}
init(message: String, oauthToken: String, status: String, userData: [UserDatum]) {
self.message = message
self.oauthToken = oauthToken
self.status = status
self.userData = userData
}
}
// MARK: - UserDatum
class UserDatum: Codable {
let emailAddress, firstName, lastName, phoneNumber: String
let userID: String
let userOnboardStage: Int
enum CodingKeys: String, CodingKey {
case emailAddress = "email_address"
case firstName = "first_name"
case lastName = "last_name"
case phoneNumber = "phone_number"
case userID = "user_id"
case userOnboardStage = "user_onboard_stage"
}
init(emailAddress: String, firstName: String, lastName: String, phoneNumber: String, userID: String, userOnboardStage: Int) {
self.emailAddress = emailAddress
self.firstName = firstName
self.lastName = lastName
self.phoneNumber = phoneNumber
self.userID = userID
self.userOnboardStage = userOnboardStage
}
}
网络服务类
enum APIError:Error{
case responseProblem
case decodingProblem
case encodingProblem
}
struct APIRequest {
let resourceURL: URL
let parameters: Dictionary<String, String>
init(endpoint: String, email: String, password: String){
let resourceString = "https://someurl/\(endpoint)"
guard let resourceURL = URL(string: resourceString) else {fatalError()}
self.resourceURL = resourceURL
var parameters = Dictionary<String, String>()
parameters = ["email_address":email,
"password":password,
"user_device_token":"",
"client_id":"",
"client_secret":""]
self.parameters = parameters
}
func save(_ loginResponseToSave:LoginResponse, completion: @escaping(Result<LoginResponse, APIError>) -> Void){
do {
var urlRequest = URLRequest(url : resourceURL)
urlRequest.httpMethod = "POST"
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = try JSONEncoder().encode(self.parameters)
let dataTask = URLSession.shared.dataTask(with: urlRequest){ data , response, _ in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, let jsonData = data else {
completion(.failure(.responseProblem))
return
}
do {
let loginData = try JSONDecoder().decode(LoginResponse.self, from: jsonData)
completion(.success(loginData))
}catch{
completion(.failure(.decodingProblem))
}
}
dataTask.resume()
}catch{
completion(.failure(.encodingProblem))
}
}
}
登录控制器
class Login {
// This function is called from the view
func loginUser(email:String, password:String) -> Bool{
let loginRequest = LoginResponse(message: "", oauthToken: "", status: "", userData: [])
let postRequest = APIRequest(endpoint: "login_buyer", email: email, password: password)
postRequest.save(loginRequest, completion:{ result in
switch result{
case .success(let status):
print(status.status) < ---- I want to access this value outside of this scope
case .failure(let error):
print(error)
}
})
/// I want to return it here
return status.status <---- for example
}
}
我希望能够访问保存在 LoginResponse 模型中的值,但是当我尝试访问它时,我得到了一个 nil 值??
【问题讨论】:
-
Result 又从何而来?我以前见过……不久前