Я получаю результат от API, я могу повторить результат. Насколько я понимаю, я могу сразу передать значение в модель.
Статья Apple Developer о моделях структур
Моя проблема в том, что я делаю это неправильно и получаю нулевое значение. Возможно, кто-то увидит, где мне нужно измениться. Я использую 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. Вместо этого выходной json из Xcode имеет [] снаружи.
{
'detail': 'VALID',
‘name’: ‘Carson,
'email': ‘[email protected]',
'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: Codable { пусть деталь, имя, электронная почта: String
private enum CodingKeys: String, CodingKey {
case detail, email
case name = "firstname"
//case picUrl = "pic_url"
}
}
Вместо чтобы увидеть весь файл swift было бы полезнее увидеть JSON. И упомянутая статья Apple не предлагает ни AnyObject, ни mutableContainers. Кстати статья все равно устарела в пользу протокола Codable
init?(json:): Неудачно. Внутри есть guard condition1, condition2, condition 3 else { return nil }. Возможно, вы захотите проверить, какое из условий не выполняется и почему.
Добавлен мой json, не работает ли моя инициализация, если хотя бы один не работает? Я только что исправил орфографическую ошибку, так что я запущу это. Редактировать: я исправил все свое правописание, чтобы выровнять, так что все должно быть в порядке. @vadin Я не понимал, что это устарело, я подумал, что это самое актуальное.
Это недопустимый JSON. Все строки, но заключенные в двойные кавычки, например. "detail": "VALID". И JSON не соответствует вашей модели, нет ключа profileURL, в этом случае инициализатор не работает.





После того, как был представлен «Codable», я всегда использую его. Вы можете взять свой JSON и проанализировать его в QuickType.io, и вы получите Struct, который подтверждает возможность кодирования.
// 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"
}
}
Круто, я не буду голосовать за это правильно (пока), но это огромный шаг для меня. Похоже, что Codable — это то, что нужно для этого.
Я отметил это правильно, так как это был большой шаг, я опубликую свой правильный код для всех, кто читает мой пост.
Ваша инициализация не удалась. Ну не получается.