Множество структурных массивов в один тип структуры - PullRequest
1 голос
/ 28 апреля 2020

Я собираюсь взять два структурных массива данных массива, извлеченных из нескольких источников (веб-вызовы REST), и привести их к одному единственному структурному массиву, который я могу использовать в UITableView.

Первоначально я пошел вниз по пути создания многомерного массива, но оказалось трудным, когда мне пришлось понижать типы как [AnyObject] и не мог читать в свойствах.

Пример данных: -

import UIKit

// First Set Of Data

struct Items : Codable{
    // List of 'items'
    let items : [Item]


}

struct Item: Codable{
    // Items inside the array

    let id : String
    let name : String
    let price : String
    let imageURL : String
    let weight : String

}

// ******** SECOND SET OF DATA

struct SecondSetOfItems : Codable {
    let mainFopCollection : MainFopCollection?

}

struct MainFopCollection : Codable {
    let sections : [Sections]?


}

struct Sections : Codable {
    let id : String?
    let fops : [Fops]?

}


struct Fops : Codable {
    let sku : String?
    let hash : Int?
    let product : Product?

}

struct Product : Codable {
    let sku : String?
    let name : String?
    let price : Price?

}

struct Price : Codable {
    let current : Double?
    let lpp : Bool?
    let unit : Unit?
    let type : String?


}

struct finalSetOfItems{

    let name : String?
    let price: String?


}

var array1 = [Items]()
var array2 = [SecondSetOfItems]()


// Originally tried:-

var multiArray = [[AnyObject]]()

multiArray.append(array1 as [AnyObject])
multiArray.append(array2 as [AnyObject])

// This part errors because I can't access this property
let name = multiArray[1][1].name

// Also tried a ternary operator (this part is within cellforrowat in my UITableViewController but I want the data to be dynamic, and not hard coded.

let name = indexPath.section == 0 ? array1![indexPath.row].name : array2![0].sections![0].fops![indexPath.row].product!.name

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

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

Желаемый результат: -

// Take complex array1 and array2 and change them into a type of finalSetOfItems
var array1 = [Items]()
var array2 = [SecondSetOfItems]()
var arrayOutput = [finalSetOfItems]()

Есть ли способ, которым я могу преобразовать оба набора данных в единый структурный тип, чтобы легче было получить доступ к свойствам? Конечная цель состоит в том, чтобы привести каждый массив в отдельный раздел в UITableView, чтобы указать, откуда поступили данные

Извинения, если мой вопрос сформулирован плохо, я все еще относительно новичок в Swift. Любая помощь будет принята с благодарностью

1 Ответ

1 голос
/ 28 апреля 2020
let firstItemSet = array1.flatMap{
    $0.items
}.map{
    FinalSetOfItems(name: $0.name, price: $0.price)
}

let secondItemSet = array2.flatMap{
    $0.mainFopCollection?.sections ?? []
}.flatMap{
    $0.fops ?? []
}.compactMap{
    $0.product
}.map{
    FinalSetOfItems(name: $0.name, price: $0.price)
}

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