Array, Map, Set, literals, comprehensions, spread, indexing, membership, mutation, keyability, duplicates и iteration order заданы как наблюдаемая политика коллекций.
Политика
Array<T> — упорядоченная sequence, Map<K,V> — упорядоченная key/value collection, Set<T> — упорядоченная uniqueness collection. Spread в array literal принимает только Array. Контекстные set { ... } и map { key: value } вычисляют операнды слева направо. Comprehension начинается с for, принимает последующие for/if без запятых и финализирует private accumulator лишь после успеха всех достижимых body.
Определённое поведение
Array сохраняет production order. Равные элементы Set схлопываются в первый insertion slot. Динамически дублированный Map key даёт fault без overwrite после вычисления операндов; простой повтор literal key — статическая ошибка. Keys обязаны быть рекурсивно keyable и сохраняют nominal identity при freeze. Remove удаляет слот порядка, reinsertion добавляет в конец, update существующего Map value не меняет key order. in работает для Array, Set, range и map.keys, но не для самого Map.
Ограничения и явный отказ
Mutation требует mutable binding. Прямой отрицательный или выходящий за границы индекс Array даёт fault; безопасное чтение использует get. Отклоняются [T], x in map, non-keyable keys, spread Set/Map, iterable spread, leading if в comprehension, clauses с запятыми, bare control на comprehension и трактовка refutable mismatch как фильтра. Пустому Set/Map literal нужен expected type.
Отложенная граница
Общая user-defined iteration, lazy/parallel comprehensions, generators, tuple/iterable spread, другие duplicate policies и unordered semantics вне контракта. Строка не итерируется напрямую; скаляры обходятся явной операцией стандартной библиотеки.
Пример
let squares = [ for value in [1, 2, 3] => value * value ]
let ids = set { for value in [2, 1, 2] => value }
let labels = map { for value in [1, 2] => value: "item {value}" }
print("{squares}:{ids.toArray()}:{labels.keys}")