Как создать вариантную модель с использованием нескольких массивов

#ios #arrays #swift #e-commerce

#iOS #массивы #swift #электронная коммерция

Вопрос:

     *From*
    let size = ["Small", "Medium", "Large"]
    let color = ["Green", "Blue", "Red"]
    let mat = ["Wood", "Glass", "Plastic"]

    *To*
    let _ = ["Small", "Green", "Wood"]
    let _ = ["Small", "Green", "Glass"]
    let _ = ["Small", "Green", "Plastice"]
    let _ = ["Small", "Blue", "Wood"]
    let _ = ["Small", "Blue", "Glass"]
    let _ = ["Small", "Blue", "Plastic"] and so on.
  

Я хотел бы создать таблицу с использованием приведенных выше массивов и иметь что-то похожее на изображение.

[Shopify sample1

Комментарии:

1. Итак, вы хотите создать структуру данных (декартово произведение) всех массивов? Это может быстро увеличиваться в размерах, поэтому, возможно, было бы лучше просто вычислить его «на лету».

2. Я думаю, вы ищете какое-то sort вместо. Массивы не являются хорошей структурой по той причине, о которой вы говорите.

Ответ №1:

В качестве простого эксперимента вы можете определить вложенные циклы для построения этого вывода:

 var combined = [[String]]()
for size in sizes {
    for color in colors {
        for material in materials {
            combined.append([size, color, material])
        }
    }
}
  

Результат

НО!

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

Например, взгляните на эту структуру:

 struct Product: Codable {
    let size: String
    let color: String
    let material: String
}
  

Таким образом, вы можете заполнить его предыдущим кодом, например:

 var products = [Product]()
for size in sizes {
    for color in colors {
        for material in materials {
            products.append(Product(size: size, color: color, material: material))
        }
    }
}
  

И будет ли у вас:

Демонстрация 2

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

Ответ №2:

Или используйте общий подход с использованием более высоких функций:

 extension Collection where Element: RangeReplaceableCollection {
    func combinations() -> [Element] {
        reduce([.init()]) { result, element in
            result.flatMap { elements in
                element.map { elements   CollectionOfOne($0) }
            }
        }
    }
}
  

Использование:

 let combinations = [size,color,mat].combinations()

for combination in combinations {
    print(combination)
}
  

Это выведет:

[«Маленький», «Зеленый», «Деревянный»]
[«Маленький», «Зеленый», «Стеклянный»]
[«Маленький», «Зеленый», «Пластиковый»]
[«Маленький», «Синий», «Деревянный»]
[«Маленький», «Синий», «Стекло»]
[«Маленький», «Синий», «Пластиковый»]
[«Маленький», «Красный», «Деревянный»]
[«Маленький», «Красный», «Стеклянный»]
[«Маленький», «Красный», «Пластиковый»]
[«Средний», «Зеленый», «Дерево»]
[«Средний», «Зеленый», «Стекло»]
[«Средний», «Зеленый», «Пластик»]
[«Средний», «Синий», «Дерево»]
[«Средний», «Синий», «Стекло»]
[«Средний», «Синий», «Пластиковый»]
[«Средний», «Красный», «Деревянный»]
[«Средний», «Красный», «Стеклянный»]
[«Средний», «Красный», «Пластиковый»]
[«Большой», «Зеленый «, «Дерево»]
[«Большой», «Зеленый», «Стеклянный»]
[«Большой», «Зеленый», «Пластиковый»]
[«Большой», «Синий», «Деревянный»]
[«Большой», «Синий», «Стеклянный»]
[«Большой», «Синий», «Пластиковый»]
[«Большой», «Красный», «Деревянный»]
[«Большой», «Красный», «Стеклянный»]
[«Большой», «Красный», «Пластиковый»]