Swift: Какая правильная реализация для создания объекта, который будет обрабатывать JSON / Dictionalry - PullRequest
1 голос
/ 16 октября 2019

Мне удалось очень запутаться в отношении Swift Codeable, struct vs. class и анализа JSON.

Я пытаюсь управлять данными для различных пакетов изображений, из которых может быть несколько пакетовприсвоено данному slate. Я хочу иметь возможность добавлять дополнительные пакеты изображений к slate, если он уже существует.

Формат JSON будет выглядеть примерно так:

{
 slate: "S1A:,
 imageBundles: [
      {
       timestamp: "2019-10-11_23:00",
       fileUrls: [
            "files/R0010514.JPG",
            "files/R0010515.JPG",
            "files/R0010516.JPG"
            ]
      },
      {
       timestamp: "2019-10-12_02:30",
       fileUrls: [
            "files/R0010525.JPG",
            "files/R0010526.JPG",
            "files/R0010527.JPG"
            ]
      }
    ]
}

Я пытался создать struct объекты для работы в Swift:

struct ImageBundle: Codable {
    var timestamp: String?
    var fileUrls: [String]?
}

struct SlateBundle: Codable {
    var slate: String?
    var imageBundles: [ImageBundle]! = []
}

Это похоже на создание объекта с назначенной информацией, однако я не уверен, как правильно использовать это в коде.

Я не могу создать новый ImageBundle() и добавить его к mySlateBundle["S1A"] Или создать новый SlateBundle(), если я попытаюсь присвоить mySlateBundle["newSlateName"]

Очевидно, что мне не хватает какой-то очень простой процедуры,или более чем вероятно смешивание моего понимания различных типов объектов.

Чтобы попытаться быть более понятным ... Как бы я объявил / назначил struct объекты для данной структуры JSON:

{
 city: "Los Angeles",
 neighborhoods: [
  {
   name: "venice",
   streets: [
        "Main Street",
        "Abbot Kinney",
        "Pacific"
        ]
  },
  {
   name: "Hollywood",
   streets: [
        "Sunset Blvd",
        "La Brea Blvd",
        "Highland Ave"
        ]
  }
 ]
}

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Этот код создаст ту же структуру, что и в вашем json.

var slate = SlateBundle(slate: "S1A")

slate.imageBundles.append(ImageBundle(timestamp: "2019-10-11_23:00", 
                                    fileUrls: ["files/R0010514.JPG", "files/R0010515.JPG", "files/R0010516.JPG"]))
slate.imageBundles.append(ImageBundle(timestamp: "2019-10-12_02:30", 
                                    fileUrls: ["files/R0010525.JPG", "files/R0010526.JPG", "files/R0010527.JPG"]))

Вы также можете создать простую функцию в SlateBundle, чтобы несколько упростить код

mutating func add(imageBundle bundle: ImageBundle) {
    self.imageBundles.append(bundle)
}

, а затемпакеты добавляются как

slate.add(imageBundle: ImageBundle(timestamp: "2019-10-11_23:00", 
                                   fileUrls: ["files/R0010514.JPG", "files/R0010515.JPG", "files/R0010516.JPG"]))
slate.add(imageBundle: ImageBundle(timestamp: "2019-10-12_02:30", 
                                   fileUrls: ["files/R0010525.JPG", "files/R0010526.JPG", "files/R0010527.JPG"]))
0 голосов
/ 16 октября 2019

Структуры Codable хороши сами по себе, я думаю, что ваша проблема может быть связана с объектами и типами значений в Swift. структуры являются типами значений, поэтому при попытке сделать что-то вроде

let slate = mySlateBundle["S1A"]
slate.imageBundles.append(someOtherBundle)

это не отразит эти изменения в словаре сланцев. Вместо этого вы можете сделать следующее:

mySlateBundle["S1A"].append(someOtherBundle)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...