Трехуровневые массивы в Swift - PullRequest
0 голосов
/ 30 марта 2019

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

Я уже пробовал искать по этому вопросу, но все вопросы по многомерным массивам, похоже, просто направлены на 2 уровня.Может быть, мне нужно подходить к этому по-другому?

let cars = [
    ["volvo", ["red", "petrol", "automatic"], ["blue", "petrol", "manual"], ["white", "diesel", "automatic"]],
    ["bmw", ["green", "petrol", "manual"], ["white", "petrol", "manual"], ["white", "diesel", "automatic"]],
    ["ford", ["black", "diesel", "automatic"], ["grey", "diesel", "manual"], ["blue", "petrol", "automatic"]]
]
let catData = cars[0][3]

Возвращает нормально ... но если я попробую это:

let cars = [
    ["volvo", ["red", "petrol", "automatic"], ["blue", "petrol", "manual"], ["white", "diesel", "automatic"]],
    ["bmw", ["green", "petrol", "manual"], ["white", "petrol", "manual"], ["white", "diesel", "automatic"]],
    ["ford", ["black", "diesel", "automatic"], ["grey", "diesel", "manual"], ["blue", "petrol", "automatic"]]
]
let catData = cars[0][3][1]

Я получаю эту ошибку: Значение типа 'Любой'не имеет подписок

Все, что я хочу сделать, - это набрать индивидуальный цвет или передачу автомобиля с помощью трехуровневого массива, но я не уверен, что это действительно сработает ... помогите!

1 Ответ

2 голосов
/ 30 марта 2019

Проблема в том, что ваш массив не является трехмерным массивом:

["volvo", ["red", "petrol", "automatic"], ["blue", "petrol", "manual"], ["white", "diesel", "automatic"]]

 ^ this is a simple String                         ^ this is an array

Поэтому ваше второе измерение состоит из String и [String].

Настоящий трехмерный массивбудет [[[String]]], однако, поскольку ваш второй уровень состоит из разных типов, он становится Any, а весь тип становится [[Any]].

Решение, объявите struct:

struct CarModel {
   let color: String
   let fuel: String // could be replaced by an enum
   let gear: String // could be replaced by an enum
}

let cars: [String: [CarModel]] = [
    "volvo": [
       CarModel(color: "red", fuel: "petrol", gear: "automatic"),
       CarModel(color: "blue", fuel: "petrol", gear: "manual"),
       CarModel(color: "white", fuel: "diesel", gear: "automatic")
     ]
]

print(cars["volvo"]![2].fuel)
...