Swift (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 00:19, 9 июня 2016.
Swift
200px
Парадигма мультипарадигменный, объектно-ориентированный
Спроектировано Крис Латтнер и Apple
Печать дисциплины строгая, статическая, вывод типов
OS iOS, OS X, watchOS, tvOS, Linux
Лицензия проприетарная
Портал: https://developer.apple.com/swift/
Влияние
Rust

Swift — (произносится [ swɪft ] )мультипарадигменный объектно-ориентированный язык программирования, созданный компанией Apple для разработчиков iOS, OS X, watchOS и tvOS. Swift работает с фреймворками Cocoa и Cocoa Touch и совместим с основной кодовой базой Apple, написанной на Objective-C.

История

Крис Латтнер начал разработку Swift в 2010 и закончил работу уже вместе с сотрудниками Apple. Swift заимствовал идеи из «Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, и еще из стольких многих языков, что сложно перечислить». 2 июня 2014 года на конференции WWDC Swift был официально представлен вместе с первым приложением, написанном на нём. Бета-версия языка была выпущена разработчиками Apple на конференции, хотя и компания не обещала, что конечная версия Swift будет совместима с тестовой версией.

Также на WWDC было выпущено 500-страничное руководство по языку Swift, которое доступно на iBooks Store.

Версия Swift 1.0 была выпущена 9 сентября 2014 года, вместе с «Gold Master» версией Xcode 6.0 для iOS.

8 июня 2015 года компания Apple объявила о выпуске новой версии Swift 2.0, которая получила более высокую производительность, новое API обработки ошибок, улучшения синтаксиса языка, а также функцию проверки доступности функций Swift для целевых ОС. Новый улучшенный компилятор и стандартные библиотеки будут выпущены под операционные системы OS X, iOS и Linux и приобретут статус Open Source

Описание

Swift берет довольно многое из Objective-C, однако он определяется не указателями, а типами переменных, которые обрабатывает компилятор. По аналогичному принципу работают многие скриптовые языки. В то же время, он предоставляет разработчикам многие функции, которые прежде были доступны в C++ и Java, такие как определяемые наименования, так называемые обобщения и перегрузка операторов.

Часть функций языка выполняется быстрее по сравнению с другими подобными языками. Например, сортировка комплексных объектов выполняется в 3,9 раз быстрее, чем в Python, и почти в 1,5 раза быстрее, чем в Objective-C.

Код, написанный на Swift, может работать вместе с кодом, написанном на языках программирования C, C++ и Objective-C в рамках одного и того же проекта.

Типы, переменные, области видимости

Пример кода, выполняющего конкатенацию 2-х строк.

 var str = "hello,"
 str += " world"

Swift поддерживает 3 уровня доступа: public, internal и private.

Опциональные типы и цепочки вызовов

Важной особенностью в Swift являются опциональные типы, которые позволяют обрабатывать ссылки и значения по образцу, сходному в C, в котором указатель может ссылаться на значение или иметь значение null. Это означает, что неопциональные типы не могут выдать ошибку "указатель на null", поскольку компилятор устраняет такую возможность.

Сущность цепочки вызовов заключается в вызове нескольких связанных методов. Например:

 let aTenant = aBuilding.TenantList[5]
 let theirLease = aTenant.leaseDetails
 let leaseStart = theirLease.startDate

Можно сократить:

 let leaseStart = aBuilding.TenantList[5]?.leaseDetails?.startDate

Типы значений

В отличии от большинства объектно-ориентированных языков, Swift предлагает встроенную поддержку по передаче данных, и по ссылке, и по значению. В случае ссылки используются классы, в случае со значением используются структуры. При этом структур имеют всё те же программные механизмы, такие как методы, реализации протоколов. Тем не менее, структуры не допускают наследование.

Программист имеет право выбрать любую из этих двух семантик при реализации структур данных. Например при выборе больших структур программист может их реализовать как классы. А маленькие структуры данных (например 2D точка) можно реализовать в виде структуры, передаваемой по значению, таким образом получая данные без перехода по указателю. Преимущество Swift заключается в том, что по умолчанию он передаёт такие типы данных как Int и Double по значению, а такие как String и Array по ссылке. Такой подход может дать сильный выигрыш в производительности приложений.

Протокол-ориентированное программирование

Swift использует протоколы, которые в общем случае известны как интерфейсы.

Например можно объявить протокол SupportsToString, который будет гарантировать, что объекты, соответствующие этому протоколу, будут реализовывать метод toString. Код протокола будет выглядеть:

 protocol SupportsToString {
     func toString() -> String
 }

Теперь можно реализовать этот протокол по отношению к классу String без доступа к базовому классу:

 extension String: SupportsToString {
    func toString() -> String {
        return self
    }
 }

Библиотеки, разработка и выполнение

Swift использует ту же среду исполнения что и Objective-C, однако требует iOS 7 / OS X 10.9 или выше. Код Swift может быть использован вместе с кодом Objective-C, а при наличии расширений и с C и C++.

Чтобы помочь разработчикам при повторном использовании уже существующего кода, Xcode 6 предлагает полуавтоматическую систему которая привязку заголовочных файлов "bridging header" чтобы предоставить коду Swift доступ к коду Objective-C.

Управление памятью

Swift использует автоматический подсчёт ссылок (АПС) для управления памятью. Apple потребовалось ручное управление при использовании Objective-C, однако представленный в 2011 году АПС обеспечил более простое выделение и очищение памяти.

Отладка и прочее

Ключевым элементом системы Swift является возможность отчётливо отлаживать и выполнять код с помощью среды разработки, используя принцип Read-eval-print loop (REPL). Согласно этому принципу пользователь вводит выражение (read), система его вычисляет (eval) и выводит пользователю (print), а затем всё повторяется (loop). Таким образом REPL действует согласно принципу "песочницы". "Песочницы" — это интерактивные представления, выполняемые в среде Xcode, которые отвечают на запросы "на лету". Если время запроса превысит время ожидания по отношению к текущему запросу, то можно использовать график для демонстрации результата.

Сходства с C

  • Большинство операторов в Swift пришли из C, несмотря на несколько новых.
  • Фигурные скобки группируют выражения.
  • Переменные присваивают значение по знаку равенства а сравниваются по двойному знаку равенства. Новый оператор === проверяет указывают ли 2 ссылки на один и тот же объект.
  • Операторы for, while, if, switch используются похожим образом, однако новые операторы вроде for in итерирует только по коллекциям, а switch может брать нецелые значения.

Сходства с Objective-C

  • Основные численные типы (Int, UInt, Float, Double).
  • Квадратные скобки используются в массивах и для объявления и для получения элемента по индексу.
  • Методы классов наследуются как и методы экземпляров. Ссылка self в методах класса указывает на класс, в котором был вызван метод.

Отличия от Objective-C

  • Выражения не нуждаются в терминирующем символе (;), хотя они нужны при записи нескольких выражений на одной строке.
  • Нет необходимости в заголовочных файлах.
  • Использование вывода типов.
  • Обобщённое программирование.
  • Функции являются объектами первого класса.
  • Перечисление пунктов может включать алгебраический тип данных.
  • Операторы могут быть переопределены для классов, а также можно создать новые операторы.
  • Строки полностью поддерживают Unicode. Большинство символов Unicode могут быть использованы в идентификаторах и операторах.
  • До Swift 2.0 отсутствовала обработка исключений (хотя оно могла быть эмулирована замыканий).
  • Поведение нескольких известных потенциальных ошибок изменено:
    • Указатели по умолчанию не являются открытыми. Программисту не нужно отслеживать и помечать имена для ссылки или перехода по ссылке.
    • Присвоения не возвращают значения. Это предотвращает известную ошибку написания i=0 вместо i == 0 при компиляции.
    • Не нужно использовать break в конце блоков switch. В общем случае нет перехода к следующему блоку за исключением случая с использованием fallthrough.
    • Переменные и константы всегда инициализированы и границы массивов всегда проверяются.
    • Переполнения целого, вызывающие неопределённое поведение отслеживаются во время исполнения кода в Swift. Программист может разрешить переполнение с помощью операторов &+, &-, &*, &/ или &%. Свойства min и max определены для всех типов и могут быть использованы для проверки потенциальных переполнений вместо того чтобы использовать константы из внешних библиотек.

Пример кода

 // this is a single line comment using two slashes. /* this is also a comment,
    but written over multiple lines */ /* multiline comments
    /* can be nested! */
    Therefore you can block out code containing multiline
    comments
 */ // Swift variables are declared with "var"
 // this is followed by a name, a type, and a value
 var explicitDouble: Double = 70 // If the type is omitted, Swift will infer it from
 // the variable's initial value
 var implicitInteger = 70
 var implicitDouble = 70.0
 var  = "美國" // Swift constants are declared with "let"
 // followed by a name, a type, and a value
 let numberOfBananas: Int = 10 // Like variables, if the type of a constant is omitted,
 // Swift will infer it from the constant's value
 let numberOfApples = 3
 let numberOfOranges = 5 // Values of variables and constants can both be
 // interpolated in strings as follows
 let appleSummary = "I have \(numberOfApples) apples."
 let fruitSummary = "I have \(numberOfApples + numberOfOranges) pieces of fruit." // In "playgrounds", code can be placed in the global scope
 print("Hello, world") // This is an array variable
 var fruits = ["mango", "kiwi", "avocado"] // Example of an if statement; .isEmpty, .count
 if fruits.isEmpty {
     print("No fruits in my array.")
 } else {
     print("There are \(fruits.count) items in my array")
 } // Define a dictionary with four items:
 // Each item has a person's name and age
 let people = ["Anna": 67, "Beto": 8, "Jack": 33, "Sam": 25] // Now we use Swift's flexible enumerator system
 // to extract both values in a single loop
 for (name, age) in people {
     print("\(name) is \(age) years old.")
 } // Functions and methods are both declared with the
 // "func" syntax, and the return type is specified with ->
 func sayHello(personName: String) -> String {
     let greeting = "Hello, \(personName)!"
     return greeting
 } // prints "Hello, Dilan!"
 print(sayHello("Dilan")) // Parameter names can be made external and required
 // for calling.
 // The external name can be the same as the parameter
 // name by prefixing with an octothorpe (#)
 // - or it can be defined separately. func sayAge(#personName: String, personAge age: Int) -> String {
     let result = "\(personName) is \(age) years old."
     return result
 } // We can also specify the name of the parameter print(sayAge(personName: "Dilan", personAge: 42))

См. также

Ссылки