2015-07-30 2 views
2

Я портирую программу Clojure на Swift. Будучи динамически типизированным языком, легко бросить различные значения вместе, как это:Простой словарь гетерогенных настроек, портированный с Clojure

(def settings {:total-gens 5 
       :name "Incredible Program" 
       :options [:a :b :c :d :e] 
       :final-comment "Hope you had a good time."}) 

проходят параметры карта, как это вокруг в программе, и я хотел бы иметь довольно подобный процесс в Swift.

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

Вот два варианта, которые были рекомендованы для меня, оба из которых, кажется многословным или странно:

1) Во-первых, сделайте enum тип всех возможных типов установки значений. Затем создайте словарь String: SettingsEnumType. Каждый раз, когда мне нужно добавить новый тип значения в словарь, мне сначала нужно изменить определение перечисления, а затем изменить словарь.

2) Вместо этого создайте пустой протокол без каких-либо требований. Затем добавьте такие значения, как Int, String и т. Д., Чтобы принять этот протокол, хотя он действительно является «фиктивным» протоколом. Затем сделайте мой словарь настроек String : SettingsProtocol, чтобы я мог добавить туда любой тип, который мне нужен (после первого расширения типа).

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

Есть ли какие-либо другие возможности для выполнения чего-то подобного? Кроме того, будет ли тип String единственным очевидным типом для ключей в словаре настроек? В этом случае Clojure снова испортил мне полезный тип keyword, который одновременно действует как функция поиска в дополнение к типу значения.

Любые советы/указатели, оцененные, поскольку я рассматриваю этот новый язык.

+1

* Тип * словаря-значения зависит от * значения * словаря-индекса. Ой! Я не знаю, как выразить это аккуратно на любом языке. Но это, безусловно, общий случай. «Enum» для типа значения и, если нужно, для типа индекса, выглядит более просто издалека. – Thumbnail

ответ

0

Сославшись Array with string and number ответ, я полагаю, вы можете создать гетерогенной словарь с ниже Синтаксис:

let heteroDict = Dictionary<Any, Any>() 

Можете ли вы попробовать это?

Смежные вопросы