Как объединить несколько отдельных результатов JSON из цикла, а затем вернуть Swift - PullRequest
1 голос
/ 24 марта 2019

Я хочу объединить 3 результата json в один для последующего зацикливания.

Я перепробовал каждую комбинацию в Интернете, но я все еще застрял в тупике.Я вызываю вызов API, который в ответ получает данные JSON.Я хочу получить первые 3 результата и вернуть эти данные вызывающему методу, однако я просто не могу найти способ найти желаемый ответ.

var data: JSON = []

func getData(forKey url: URL, completion: @escaping ([JSON]) -> Void){

        AF.request(url).responseJSON { (responseData) -> Void in
            if((responseData.result.value) != nil) {
                let swiftyJsonVar = JSON(responseData.result.value!)
                for loopID in 0 ... 2{
                    print(swiftyJsonVar["results"][loopID])
                }
            }
            return completion([self.data])
        }
    }

Мои желаемые результаты

[
    {
        "name": "james",
        "location": "Mars"
    },
    {
        "name": "james",
        "location": "Mars"
    },
    {
        "name": "james",
        "location": "Mars"
    }
]

Когда в моем цикле я получаю, х 3

{
    "name": "james",
    "location": "Mars"
}

1 Ответ

1 голос
/ 24 марта 2019

Для начала я бы поставил точку останова и посмотрел, как выглядит ваш объект ответа с любой конечной точки, на которую вы попали.Возможно, это действительно первые три элемента массива?

Переходя к рассмотрению вопроса, я бы использовал протокол Codable для расшифровки вашего ответа.Я пропущу часть Alamofire и сосредоточусь исключительно на расшифровке объекта.Используя ваш пример, вот как будет выглядеть структура:

struct ResponseObject: Codable {
    let name: String
    let location: String
}

Я бы не использовал в своем коде оператор bang (!), так как вы выдадите исключение, если сообщите компилятору, что это100% гарантированных денег в банке объект не ноль и это на самом деле.Вместо этого разверните необязательные параметры.

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

var arrayOfObjects: [ResponseObject] = []

Затем выпросто объявите декодер и декодируйте свои данные:

let decoder = JSONDecoder()

do {
    if let data = rawData {
        arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
        print("number of objects:", arrayOfObjects.count)
        let slice = arrayOfObjects.prefix(3)
        arrayOfObjects = Array(slice)
        print("number of objects after slicing the array:", arrayOfObjects.count)
    }
} catch {
    print(error)
}

Вместо того, чтобы проходить по массиву, просто захватите первые три элемента массива с помощью .prefix(3).Поигравшись с этим только сейчас, я попытался добавить к первым 10 элементам массива префикс с 4, и он не сгенерировал исключение, поэтому я думаю, что это должно сработать без предварительной проверки счетчика массива.

Я быПредлагаем взглянуть на документацию Swift онлайн по Re: Arrays или вы можете получить довольно симпатичное приложение для Mac OS под названием Dash, которое позволяет загружать наборы документов для нескольких языков на вашем компьютере локально.

Удачи!

...