## Коллекции (набор значений)

1. :heavy_check_mark: [Protocol extensions](https://www.hackingwithswift.com/sixty/9/4/protocol-extensions)
2. :heavy_check_mark: [When are protocol extensions useful in Swift?](https://www.hackingwithswift.com/quick-start/understanding-swift/when-are-protocol-extensions-useful-in-swift)

[Apple](https://developer.apple.com/documentation/swift/collection): A collection is a stable sequence with addressable "positions," represented by an associated Index type.

```swift
protocol CollectionType : SequenceType {
  typealias Index : ForwardIndexType             // a position
  subscript(i: Index) -> Iterator.Element {get}

  var startIndex: Index {get}
  var endIndex: Index {get}
}
```

Всего в swift есть коллекции:

* **Array (массив)** - сохраняют свой порядок и могут содержать дубликаты. Массивы в свифте реализованы как структура;

  1. [Вся правда о массивах](https://www.youtube.com/watch?v=47_LhSf-ago)

    <details><summary>Open</summary>
    <p>
    
    * Вы можете свободно добавлять к ним данные (если не let), чтобы со временем наращивать свои данные, или вы можете удалить или даже изменить порядок элементов, если хотите.

    * Мы считываем значения из массивов, используя их числовую позицию, отсчитывая от 0. Этот «отсчет от 0» имеет технический термин: zero-based `array[0]` 
      
    > Для сравнения, массивы должны хранить свои элементы в том порядке, в котором вы им указываете, поэтому, 
    > чтобы проверить, существует ли элемент X в массиве, содержащем 10 000 элементов, 
    > Swift необходимо начать с первого элемента и проверять каждый элемент, пока он не будет найден
      
    `var website = ["Apple", "www.apple.com"]`
      
    Получить значения: `website[0]` и `website[1]`
      
    </p>
    </details>

---

* **Set (множество)** - неупорядочены и не могут содержать дубликатов. Все объекты внутри `Set` должны конфортить протокол Hashable. Set в Swift реализованы как структуры;


    <details><summary>Open</summary>
    <p>
 
  Наборы представляют собой наборы значений, как и массивы, за исключением двух отличий:

    * Предметы хранятся не в каком-либо порядке; они хранятся в случайном порядке, поэтому мы не можем считывать значения из набора с использованием числовых позиций, как с массивами. 
    
  * Ни один предмет не может появляться в наборе дважды; все предметы должны быть уникальными.
  
  `let colors = Set(["red", "green", "blue"])`
  
    > Поскольку set не должен хранить ваши объекты в том порядке, в котором вы их добавляете, 
    > они вместо этого могут хранить их в случайном порядке, который оптимизирует их для быстрого поиска. 
    > Итак, когда вы говорите «содержит ли этот набор элемент X», вы получите ответ за доли секунды, независимо от того, насколько велик набор.

    </p>
    </details>

---

* **Dictionaries (словари) (Hash Map)** - неупорядоченная структура данных, которая позволяет хранить пары «ключ — значение». Dictionary в Swift реализованы как структуры;


    <details><summary>Open</summary>
    <p>
  
  Словари - это коллекции значений, как и массивы, но вместо того, чтобы хранить вещи с целочисленной позицией, вы можете получить к ним доступ, используя все, что захотите.
 
  `let heights = ["Taylor Swift": 1.78, "Ed Sheeran": 1.73]` или `идентификатора(ключ) : значение, которое мы хотим сохранить`

   Получить значения: `let result: Int = heights["Taylor Swift", default: 0]`; default - значит, что есть значения "Taylor Swift" нет в словаре, то верни 0.
  
   > В отличие от кортежей, нельзя гарантировать, что ключ в словаре существует. 
   > Вот почему чтение значения из словаря может ничего не вернуть - возможно, вы запросили ключ, которого не существует!
  
    </p>
    </details>

---

* **String** [снова являются](https://developer.apple.com/documentation/swift/string) являются коллекциями. Это означает, что вы можете переворачивать их, циклически перебирать их посимвольно, использовать map() и flatMap() и многое другое.

---

Новые невстроенные коллекции swift:

* **[OrderedSet](https://github.com/apple/swift-collections/blob/main/Documentation/OrderedSet.md)** - тот же уникальный Set, только значения в нем упорядочены;

* **[OrderedDictionary](https://github.com/apple/swift-collections/blob/main/Documentation/OrderedDictionary.md)** - упорядоченный набор пар ключ-значение;

* **[Deque](https://github.com/apple/swift-collections/blob/main/Documentation/Deque.md)** - реализует упорядоченную коллекцию с произвольным доступом, которая поддерживает эффективные вставки и удаления с обоих концов. По сути тот же массив;

> To use OrderedSet, first add the swift-collections Swift package to your project. Then, import the OrderedCollections module: `import OrderedCollections`

---

[5.3.1.4.4 Collections And Tuple Theme Folder](../5.3.1.4.4%20CollectionsAndTuple/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [5.3.1.4.4.2 Associated Array Theme](./5.3.1.4.4.2%20AssociatedArray.md)