У меня есть большой массив данных, который принимает следующий вид: [Array of four integers], {Набор строк, относящихся к этому массиву целых чисел}. Например,Коллекции - извлечение из массива строк в словаре
[1,1,1,8],{"(1+1+1)*8"}
[1,1,2,8],{"1*(1 + 2)*8","(1 + 2)/(1/8)"}
т.д.
У меня есть тысячи этих пар, сохраненных во внешнем текстовом файле, и должны быть в состоянии вспомнить отдельные линии на основе четырех целых чисел в ключе. Одно из решений, казалось бы, чтобы прочитать текстовый файл в словарь во время запуска, но очевидно, формулировка для словаря
let myDict2:Dictionary<Array<Int>, Array <String>> = [[1,1,1,8]: ["(1+1+1)*8"],[1,1,2,8]: ["1*(1 + 2)*8","(1 + 2)/(1/8)"]]
терпит неудачу, потому что «Тип„Массив“не соответствует протоколу„Hashable“.»
Но мы можем преобразовать ключ из массива целых чисел в строку, и попытаться с этим:
let myDict2:Dictionary<String, Array <String>> = ["1118": ["(1+1+1)*8"],"1128": ["1*(1 + 2)*8","(1 + 2)/(1/8)"]]
Нет ошибок, и даже похоже, что мы можем извлечь результат с
let matches2=myDict2["1128"] // correctly returns ["1*(1 + 2)*8", "(1 + 2)/(1/8)"]
Но когда мы пытаемся вытащить элемент из этого ответа с matches2[0]
, мы получаем "Cannot subscript a value of type '[String]?'"
ударяться случайно на моей клавиатуре, я получил это вр k с matches2![0]
, но я понятия не имею, почему.
- Есть ли способ сделать мою первоначальную попытку словаря [array of ints, set of strings] работать?
- Во второй формулировке [строка, набор строк], Почему
matches2![0]
работы иmatches2[0]
нет? - Является ли словарь разумным подходом к этому, или есть какая-то другая структура данных, которая может лучше выполнить мою цель?
Из-за ограничений на массив Integer, я знаю, что нет двусмысленных записей, если они преобразуются в строковые формы. Тем не менее, ваши примеры реализации Hashable и Equatable наверняка пригодится в будущем. Спасибо. –