Свифт и JSON вопросы - PullRequest
       2

Свифт и JSON вопросы

0 голосов
/ 29 октября 2018

Я новичок в Swift, сейчас играю со стикерами.

У меня есть файл JSON со следующей структурой:

{
 "stickers": [{
    "filename": "happy_face",
    "description": "Happy Face",
    "premium": "false",
    "categories": ["blue", "green", "red"],
    "genders": ["male", "female"]
 },{
    "filename": "sad_face",
    "description": "Sad Face",
    "premium": "false",
    "categories": ["blue", "green", "red", "yellow"],
    "genders": ["male"]
  }]
}

Стикеры будут иметь то же имя файла, но будут разделены на папки в соответствии с их категорией и полом.

Я могу читать данные JSON просто отлично. Моя проблема в том, что я пытаюсь использовать данные JSON.

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

let stickerPack = StickerPack.load()
let allStickers = stickerPack!["stickers"] as? [[AnyHashable : Any]]

func getStickersWithCategory(category: String){

var stickers = [AnyObject]()

for sticker in allStickers! {
    let cat = sticker["categories"] as? [String]
    for item in cat! {
        if item.contains(category){
            stickers.append(sticker)
       }
    }
  }
}

Результат этого

"Тип аргумента '[AnyHashable: Any]' не соответствует ожидаемому типу 'AnyObject'"

Кто-нибудь может указать мне правильное направление? Это возможно с этой структурой JSON? или лучше иметь разную структуру, разделив каждую категорию и пол? это приведет к большому количеству повторений. Но, возможно, я создаю больше проблем, пытаясь сохранить структуру JSON таким образом.

Вся помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Будьте более конкретны, это позволит избежать ошибок такого рода.

Этот массив JSON имеет значение [[String:Any]] и , никогда AnyHashable, поскольку ключи должны быть строковыми

let allStickers = stickerPack!["stickers"] as? [[String:Any]]

stickers того же типа и никогда , включая AnyObject. Все типы JSON являются типами значений (Any).

var stickers = [[String:Any]]()

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

if let stickerPack = StickerPack.load(),
   let allStickers = stickerPack["stickers"] as? [[String:Any]] {
     stickers = allStickers.filter({ (sticker) -> Bool in
         guard let categories = sticker["categories"] as? [String] else { return false }
         return categories.contains(category)
     })
...
0 голосов
/ 29 октября 2018

Проблема в том, что вы объявили allStickers как let allStickers = stickerPack!["stickers"] as? [[AnyHashable : Any]], что означает, что его тип будет [[AnyHashable:Any]]? или Array<Dictionary<AnyHashable:Any>>. Когда вы выполняете итерацию по этому массиву в for sticker in allStickers!, тип sticker будет Dictionary<AnyHashable:Any>. Dictionary является структурой, поэтому она не соответствует AnyObject, и, следовательно, вы не можете добавить sticker к stickers, который объявлен как массив AnyObjects.

Таким образом, изменение var stickers = [AnyObject]() на var stickers = [Any]() или, более конкретно, var stickers = [[AnyHashable:Any]]() должно решить вашу проблему.

func getStickersWithCategory(category: String){
    var stickers = [[AnyHashable:Any]]()

    for sticker in allStickers! {
        let cat = sticker["categories"] as? [String]
        for item in cat! {
            if item.contains(category){
                stickers.append(sticker)
            }
        }
    }
}

Кстати, вам рекомендуется использовать Codable в Swift 4 при обработке JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...