#json #swift #parsing
#json #swift #синтаксический анализ
Вопрос:
Мне нужно получить данные из URL. Например, используя postman, если я попытаюсь выполнить запрос get с этим моим личным url = "http://127.0.0.1/MyWebService/api/fetch_image.php"
и добавлю в параметры: id_key -> id_team в значении -> 2, программа вернет мне это:
{«image_team»:[{«id»:1,»img_path»:»http://localhost/MyWebService/images/Schermata.png»,»id_team»:2},{«id»:2,»img_path»:»http://localhost/MyWebService/images/Schermata.png»,»id_team»:2},{«id»:3,»img_path»:»http://localhost/MyWebService/images/Schermata.png»,»id_team»:2}]}
теперь в Swift я написал эти классы:
class ClassJsonTeam: Codable {
private var teams: [JsonTeam]
init(teams: [JsonTeam]) {
self.teams = teams
}
func getTeams()-> [JsonTeam]{
return(self.teams);
}
func setTeams(teams:[JsonTeam]){
self.teams = teams;
}
}
class JsonTeam: Codable {
private let id: Int
private var name: String
private var member: Int
init(id: Int, name: String, member: Int) {
self.id = id
self.name = name
self.member = member
}
func getId()->Int{
return(self.id);
}
func setId(id:Int){
self.member = id;
}
func getName()->String{
return(self.name);
}
func setName(name:String){
self.name = name;
}
func getMembers()->Int{
return(self.member);
}
func setMembers(members:Int){
self.member = members;
}
}
Вопрос в том, как я могу сделать запрос и сохранить дату в классе?
(Я использую Swift 4)
Ответ №1:
Извините, но это ужасный код на языке objective-c.
Очевидно, что вам нужны константы в ваших классах, поэтому объявляйте константы, и почти во всех случаях вам вообще не нужны классы
struct Response: Decodable {
let teams: [Team]
private enum CodingKeys : String, CodingKey { case teams = "image_team" }
}
struct Team: Decodable {
let id: Int
let imagePath: URL
let teamID: Int
private enum CodingKeys : String, CodingKey { case id, imagePath = "img_path", teamID = "id_team" }
}
Вот и все. Больше ничего. Никаких странных общедоступных геттеров и частных сеттеров. Нет инициализаторов при работе с (De)codable
. И если вы будете использовать более быстрые ключи, вы можете полностью опустить CodingKeys
объявления. Ключ imagePath
может быть даже расшифрован как URL
.
И наконец: никаких конечных точек с запятой!
Для чтения данных используйте традиционную URLSession
let url = URL(string: "http://127.0.0.1/MyWebService/api/fetch_image.php")!
let dataTask = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print(error)
return
}
do {
let result = try JSONDecoder().decode(Response.self, from: data!)
print(result)
} catch {
print(error)
}
}
dataTask.resume()
Чтобы добавить параметры, вы должны добавить query
к URL, например
http://127.0.0.1/MyWebService/api/fetch_image.php?id_team=2
но это зависит от вашего серверной части.
Комментарии:
1. Кроме того, я бы посоветовал вам развернуть URL и не использовать оператор bang. Кроме того, вы также можете удалить разрешенную задачу данных и использовать .resume() в конце фигурной скобки.
2. @FloWy Если URL является буквальной константой, и вы знаете, что она действительна, нет ничего плохого в принудительном разворачивании ее. Исключение
let dataTask
— дело вкуса 😉3. Я полностью согласен, но, на мой взгляд, это плохая практика. Если вы единственный в своей команде, это нормально, но если у вас более крупный проект с несколькими командами, лучше развернуть URL.
4. @FloWy Я сильно сомневаюсь, что люди, работающие над более крупными проектами в командах, задали бы такой вопрос здесь, на SO 😉
5. Все возможно:D