старый синтаксис Swift 1 основан на пути вы имеете дело с наборами опций в C и Objective-C: Вы сохраняете возможность установить в целочисленном типе и использовать битовые операторы (|
и &
и ~
), чтобы манипулировать ими. Таким образом, .UsernameAndPassword | .LogInButton
означает опцию, в которую включены как опции .UsernameAndPassword
, так и .LogInButton
. В старом синтаксисе вы используете nil
для представления пустого набора параметров (в котором не включены никакие параметры), что не очевидно на основе синтаксиса для непустого набора.
Крис Лэттнер описал измененный синтаксис в WWDC 2015 Session 106: What's New in Swift. Сначала он описывает проблемы со старым синтаксисом:
Проблема в том, что когда вы переходите к другим синтаксисам, которые вы в конечном итоге используете, это немного менее приятно. Вы создаете пустую опцию с nil - это не имеет смысла, потому что опции и опции - это совершенно разные понятия, и они объединены вместе. Вы извлекаете их с побитовыми операциями, которые являются болезненными и супер-склонными к ошибкам, и вы можете легко ошибиться.
Затем он описывает новый подход:
Но Swift 2 решает эту проблему. Он делает набор опций set-like. Это означает, что наборы параметров и наборы теперь формируются с квадратными скобками. Это означает, что вы получаете пустые наборы с пустым набором квадратных скобок, и вы получаете полный набор стандартных API-интерфейсов для работы с наборами опций.
Причина новый синтаксис работает потому, что OptionSetType
соответствует ArrayLiteralConvertible
протоколу (косвенно, сообразуясь с SetAlgebraType
). Этот протокол позволяет инициализировать соответствующий объект с использованием литерала массива, имея init
, который принимает список элементов.
В новом синтаксисе Swift 2 [ .UsernameAndPassword, .LogInButton ]
представляет собой набор опций, содержащий как .UsernameAndPassword
, так и .LogInButton
. Обратите внимание, что он выглядит так же, как синтаксис, с помощью которого вы можете инициализировать простой старый Set
: let intSet: Set<Int> = [ 17, 45 ]
. Новый синтаксис делает очевидным, что вы указываете пустую опцию, заданную как []
.
«Второй принимает различные случаи перечисления и помещает их в массив». Нет, вторая - замена первого. – NobodyNada
@NobodyNada да, оба делают то же самое - они описывают коллекцию случаев перечисления. – tylersimko
Вид, но это набор параметров, а не массив. – NobodyNada