Оглавление  SE-0172 добавляет новый RangeExpression протокол и набор префиксных/постфиксных операторов для определения односторонних диапазонов, в которых либо нижняя, либо верхняя граница не определена. Можно использовать одностороннюю последовательность, чтобы создать бесконечную последовательность. Это более гибкая замена enumerated(), если не нужно, чтобы нумерация начиналась с нуля: Когда односторонняя последовательность используется в сабскрипте коллекции, то startIndex или endIndex самостоятельно “заполняют” в коллекции пропущенную верхнюю или нижнюю границу, соответственно. Сравнения паттернов — это когда односторонняя последовательность используется в конструкции сравнения паттернов, например, в case или switch. Обратите внимание, что компилятор пока не может определить, что switch является здесь лишним. SE-0168 вводит простой синтаксис для многострочных строковых литералов ("""). В многострочном литерале не нужно экранировать одинарные кавычки, что означает, что такие форматы, как JSON и HTML, могут быть вставлены в них безо всякого экранирования. Отбивка закрывающего литерала определяет, сколько пробелов будет удалено с начала каждой строки. Чтобы увидеть результат работы print, можно вывести консоль нажав (View > Debug Area > Activate Console). SE-0163 является первой частью пересмотренной строковой модели для Swift 4. Самое большое изменение, что теперь строка — это коллекция (как раньше было в Swift 1.x), то есть функциональность String.CharacterView была свернута в родительский тип. (Другие виды, UnicodeScalarView, UTF8View, и UTF16View, по прежнему присутствуют.) Обратите внимание, что SE-0163 еще не полностью реализован, и в будущем будут более строгие изменения. Экземпляры слайса строки теперь являются типом Substring. Оба типа String и Substring реализуют протокол StringProtocol. Почти все API для строк живет в StringProtocol, поэтому String и StringProtocol, в основном, ведут себя одинаково. Swift 4 будет поддерживать Unicode 9, исправлены проблемы с надлежащей кластеризацией графем для современных эмодзи. Всё указанное ниже теперь является одним символом: Хабрапарсер сожрал все эмодзи, с ними смотреть тут Теперь можно получить доступ к точкам Character напрямую без превращения их в строку (SE-0178). SE-0169 изменяет правила контроля доступа так, что теперь приватные объявления видимы в экстеншенах родительского типа в том же файле. Это позволяет разбить определение вашего типа на несколько экстеншенов и по-прежнему использовать приватный доступ для большинства «приватных» вещей, уменьшая потребность в использовании ключа доступа fileprivate. Вероятно, одна из главных особенностей Swift 4 это новая модель ключей пути (key path)  описанная в SE-0161. В отличии от строковых ключей пути в Cocoa, в Swift ключи пути строго типизированные. Ключи пути можно указывать, начиная с корневого типа и опускаться до любой комбинации свойств и имен. Написание ключа пути начинается с бэкслеша: \Book.title. Любой тип в Swift принимает  — сабскрипт для получения или установки значения для нужного ключа пути.  Ключи пути — это объект KeyPath, который можно хранить и производить манипуляции с ним. Например, можно добавить дополнительные сегменты к ключу пути, чтоб углубиться дальше. В ключах пути так же можно использовать сабскрипт нотацию. Довольно удобный способ для работы с коллекциям, массивам или словарям. Эта функциональность пока еще не реализована в текущем снэпшоте. SE-0166: Swift Archival & Serialization определяет, как типы в Swift (классы, структуры, и енумы) будут сериализовывать и архивировать себя. Типы могут сделать себя (раз-)архивируемыми реализовав, протокол Codable. В большинстве случаев имплементация Codable протокола — все что требуется. Компилятор может сгенерировать остальную часть имплементации сам, только если все члены типа реализуют Codable. Так же можно переопределить стандартное поведение, если нужно поменять то как, тип себя сериализует. В этой теме есть много нюансов — обязательно ознакомьтесь с предложением для уточнения деталей. Когда у вас есть значение, реализующее Codable, нужно передать его кодировщику, чтобы заархивировать. Вы можете написать свои кодеры и декодеры, которые используют инфраструктуру от Codable, но в Swift будут поставляться встроенные для JSON (JSONEncoder и JSONDecoder) и для списка свойств (PropertyListEncoder и PropertyListDecoder). Они определены в SE-0167. NSKeyedArchiver так же будет поддерживать все Codable типы SE-0165 добавляет несколько улучшений для Dictionary и Set. Создание словаря из последовательности пар ключ-значение. Теперь можно определить то, как дубли ключей будут обработаны, когда создается словарь из последовательности или производится слияние последовательности в текущий словарь. Можно определить значччение по умолчанию для несуществующих ключей, как аргумент сабскрипта, сделав возвращаемый тип не опциональным. Это особенно важно когда нужно мутировать значение через сабскрипт: filter возвращает Dictionary а не Array. Аналогично, новый метод mapValues преобразует значения c сохранением его структуры Set.filter так же возвращает Set а не Array. Группировка последовательности значений в букеты. разбиваем слова в списке по их первой букве. SE-0173 представляет новый метод для обмена двух элементов в коллекции. В отличии от существующего swap(_:_:), метод swapAt(_:_:) принимает индексы элементов, которые нужно обменять, а не сами элементы (через inout аргументы). Причина для добавления этого метода в том, что обмен с двумя inout аргументами несовместим
с новым правилами доступа к памяти SE-0176. Существующая функция swap(_:_:) больше не будет работать для обмена двух элементов одной и той же коллекции. SE-0171 добавляет вариант reduce метода в котором результат передается как inout в функцию combine. Это может быть существенным ускорением для алгоритмов которые используют reduce чтобы инкрементально строить последовательности, путем исключения копирования и промежуточного результата. SE-0171 пока что не реализован Как представлено в SE-0148, сабскрипт теперь может принимать и возвращать аргументы в виде генериков. Канонический пример — это тип который предсталяет JSON данные: можно определить сабскрипт с генериком, чтобы контекст, вызывающего кода смог определить ожидаемый возвращаемый тип. Другой пример: сабскрипт в Collection, который принимает последовательность индексов и возвращает массив значений этих индексов. SE-0170 исправляет некоторое опасное поведение с мостом между числовым типом в Swift и NSNumber. Теперь можно писать эквивалент кода на Objective-C UIViewController <SomeProtocol> * в Swift,
например объявить переменную с конкретным типом и связать её к одному или нескольким протоколам одновременно (SE-0156). Синтаксис let variable: SomeClass & SomeProtocol1 & SomeProtocol2 JS Dev. Ex JS Dev in Muse Group (Musescore)