2015-11-23 5 views
6

Я пытаюсь следовать некоторым учебникам IOS Swift для подключения к Parse.comв Swift, что означает этот особый синтаксис?

codementor.io tutorial:

loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton | .Facebook | .Twitter 

makeschool tutorial

loginViewController.fields = [.UsernameAndPassword, .LogInButton, .SignUpButton, .PasswordForgotten, .Facebook] 

Я предполагаю, что бывший является коммутатор 1.x, и thellatter - Swift 2. Из контекста они, похоже, делают то же самое, но я еще не нашел ссылки на язык для изменения синтаксиса. Ужасно трудно найти точки, трубы и запятые ... может кто-нибудь объяснить синтаксис в каждом фрагменте? (Я работаю над чтением через спецификацию языка, но было бы интересно получить приложение для работы!)

ответ

7

старый синтаксис 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 ]. Новый синтаксис делает очевидным, что вы указываете пустую опцию, заданную как [].

1

Swift больше не поддерживает оператор вертикальной полосы, который использовал вашу первую строку. Во втором - различные случаи перечисления и их описание как набор опций. Вот пример from the Swift docs:

enum CompassPoint { 
    case North 
    case South 
    case East 
    case West 
} 

directionToHead = .South 

switch directionToHead { 
case .North: 
    print("Lots of planets have a north") 
case .South: 
    print("Watch out for penguins") 
case .East: 
    print("Where the sun rises") 
case .West: 
    print("Where the skies are blue") 
} 

// prints "Watch out for penguins" 
+0

«Второй принимает различные случаи перечисления и помещает их в массив». Нет, вторая - замена первого. – NobodyNada

+0

@NobodyNada да, оба делают то же самое - они описывают коллекцию случаев перечисления. – tylersimko

+2

Вид, но это набор параметров, а не массив. – NobodyNada

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