我正在从API接收结果,我可以遍历结果。我的理解是,我可以立即将值传递给模型。
Apple Developer article on struct models
我的问题是我没有正确执行并且收到nil值。也许有人可以看到我需要更改的地方。我正在使用Swift 4.2
这是我的结构模型。
import Foundation
struct ProfileModel {
//MARK: Properties
var name: String
var email: String
var profileURL: String
//MARK: Initialization
}
extension ProfileModel{
init?(json: [String:AnyObject]) {
guard
let name = json["name"] as? String,
let email = json["email"] as? String,
let profileURL = json["profileURL"] as? String
else { return nil }
self.name = name
self.email = email
self.profileURL = profileURL
}
}
这是我的urlConnection中的结果代码。让我知道是否要查看整个swift文件
//create dataTask using the session object to send data to the server
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
//create json object from data
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject] {
self.onSuccess(data: json)
}
} catch let error {
print(error.localizedDescription)
}
})
task.resume()
}
func onSuccess(data: [String:AnyObject]){
print("onSuccess")
let myProfile = ProfileModel(json: data)
//myProfile is nil while unwrapping
let title: String = myProfile!.name
print(title)
}
我可以遍历字符串,因为我能够打印“数据”。我只是认为将所有内容放入ProfileModel并整体管理该对象会更清洁。
这个json是我更简单的一个,这就是为什么我将其用于此问题。我也不记得了,但是我不得不使用“ [String:AnyObject]”来正确获取json。这是直接从我的终端中提取的,这是我的JsonResponse中传递的数据。 Xcode的输出json的外面是[]。
{
'detail': 'VALID',
‘name’: ‘Carson,
'email': ‘carson.skjerdal@somethingelselabs.com',
'pic_url': None
}
编辑:
所以我的问题解决了,最终移居到Codable是关键。这是我的固定代码,适用于可能需要可行解决方案的任何人。
URLSession.shared.dataTask(with: request as URLRequest) { (data, response
, error) in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
let gitData = try decoder.decode(ProfileModel.self, from: data)
print(gitData.name)
self.onSuccess(data: gitData)
} catch let err {
print("Err", err)
}
}.resume()
}
func onSuccess(data: ProfileModel){
print("onSuccess")
print(data.email)
}
我的可编码结构-略有简化
import Foundation
struct ProfileModel:可编码{ 详细信息,名称,电子邮件:字符串
private enum CodingKeys: String, CodingKey {
case detail, email
case name = "firstname"
//case picUrl = "pic_url"
}
}
答案 0 :(得分:1)
在引入“ Codable”之后,我总是使用它。 您可以将您的JSON ans解析到QuickType.io,然后将获得一个结构,以确认可编码
// To parse the JSON, add this file to your project and do:
//
// let aPIResponse = try? newJSONDecoder().decode(APIResponse.self, from: jsonData)
import Foundation
struct APIResponse: Codable {
let detail, name, email, picUrl: String
enum CodingKeys: String, CodingKey {
case detail, name, email
case picUrl = "pic_url"
}
}