Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Swift является универсальным , несколько парадигм , составленный язык программирования , разработанный Apple Inc. и сообщества с открытым исходным кодом , первый выпущенный в 2014 году Свифт был разработан в качестве замены для Apple, ранее Язык программирования Objective-C , а Objective-C практически не изменился с начала 1980-х годов, и в нем отсутствовали современные языковые особенности. Swift работает с фреймворками Apple Cocoa и Cocoa Touch. , а ключевым аспектом дизайна Swift была способность взаимодействовать с огромным объемом существующего кода Objective-C, разработанного для продуктов Apple за предыдущие десятилетия. Он построен на основе компилятора LLVM с открытым исходным кодом и включен в Xcode с версии 6, выпущенной в 2014 году. На платформах Apple [11] он использует библиотеку времени выполнения Objective-C, которая позволяет использовать C , Objective-C , C ++ и Swift. код для запуска в одной программе. [12]

Apple планировала, что Swift будет поддерживать многие основные концепции, связанные с Objective-C , в частности, динамическую отправку , широко распространенное позднее связывание , расширяемое программирование и аналогичные функции, но более «безопасным» способом, что упрощает обнаружение программных ошибок ; Swift имеет функции, устраняющие некоторые распространенные ошибки программирования, такие как разыменование нулевого указателя, и предоставляет синтаксический сахар, помогающий избежать пирамиды гибели . Swift поддерживает концепцию расширяемости протокола , систему расширяемости, которая может применяться к типам, структурам и классам., который Apple продвигает как реальное изменение парадигм программирования, которое они называют «протокольно-ориентированным программированием» [13] (аналогично чертам ). [14]

Swift был представлен на Всемирной конференции разработчиков Apple (WWDC) в 2014 году . [15] В течение 2014 года он был обновлен до версии 1.2 и серьезным обновлением до Swift 2 на WWDC 2015. Изначально это был частный язык , версия 2.2 была сделана с открытым исходным кодом под лицензией Apache License 2.0 3 декабря 2015 года для платформ Apple и Linux . [16] [17]

В версии 3.0 синтаксис Swift претерпел значительную эволюцию, при этом основная группа разработчиков сделала упор на стабильность исходного кода в более поздних версиях. [18] [19] В первом квартале 2018 года Swift превзошел Objective-C по измеренной популярности. [20]

Swift 4.0, выпущенный в 2017 году, внес несколько изменений в некоторые встроенные классы и структуры. Код, написанный с помощью предыдущих версий Swift, можно обновить с помощью функции миграции, встроенной в Xcode. Swift 5, выпущенный в марте 2019 года, представил стабильный бинарный интерфейс на платформах Apple, что позволило встраивать среду выполнения Swift в операционные системы Apple. Исходный код совместим со Swift 4. [21]

Swift 5.1 был официально выпущен в сентябре 2019 года. Swift 5.1 основан на предыдущей версии Swift 5, расширяя стабильные функции языка до времени компиляции с введением стабильности модуля. Внедрение стабильности модуля позволяет создавать и совместно использовать двоичные фреймворки, которые будут работать с будущими выпусками Swift. [22]

История [ править ]

Разработка Swift началась в июле 2010 года Крисом Латтнером при возможном сотрудничестве со многими другими программистами Apple . Swift взял языковые идеи «из Objective-C , Rust , Haskell , Ruby , Python , C # , CLU и слишком многих других, чтобы их перечислить». [8] 2 июня 2014 года приложение Apple Worldwide Developers Conference (WWDC) стало первым публично выпущенным приложением, написанным на Swift. [23] бета - версия на языке программированиябыл выпущен для зарегистрированных разработчиков Apple на конференции, но компания не обещала, что окончательная версия Swift будет иметь исходный код, совместимый с тестовой версией. Apple планировала сделать доступными конвертеры исходного кода, если это необходимо для полной версии. [23]

Swift Programming Language , бесплатное руководство на 500 страниц, также было выпущено на WWDC и доступно в Apple Books Store и на официальном сайте. [24]

Swift достиг версии 1.0 9 сентября 2014 года, с Gold Master в Xcode 6.0 для прошивки . [25] Swift 1.1 был выпущен 22 октября 2014 года одновременно с запуском Xcode 6.1. [26] Swift 1.2 был выпущен 8 апреля 2015 года вместе с Xcode 6.3. [27] Swift 2.0 был анонсирован на WWDC 2015 и стал доступен для публикации приложений в App Store 21 сентября 2015 года. [28] Swift 3.0 был выпущен 13 сентября 2016 года. [29] Swift 4.0 был выпущен в сентябре 19, 2017. [30] Swift 4.1 был выпущен 29 марта 2018 года. [31]

Swift занял первое место в категории « Самый любимый язык программирования» в опросе разработчиков Stack Overflow в 2015 году [32] и второе место в 2016 году [33].

3 декабря 2015 года язык Swift, вспомогательные библиотеки, отладчик и диспетчер пакетов были открыты по лицензии Apache 2.0 с исключением Runtime Library Exception, [34] и был создан Swift.org для размещения проекта. Исходный код размещен на GitHub , где любой может легко получить код, собрать его самостоятельно и даже создать запросы на вытягивание, чтобы вернуть код обратно в проект.

В декабре 2015 года IBM анонсировала свой веб-сайт Swift Sandbox, который позволяет разработчикам писать код Swift на одной панели и отображать вывод на другой. [35] [36] [37] Поддержка Swift Sandbox прекращена в январе 2018 года. [38]

Во время WWDC 2016 Apple анонсировала эксклюзивное приложение для iPad под названием Swift Playgrounds , предназначенное для обучения людей программированию на Swift. Приложение представлено в виде интерфейса, похожего на трехмерную видеоигру, который обеспечивает обратную связь, когда строки кода размещаются в определенном порядке и выполняются. [39] [40] [41]

В январе 2017 года Крис Латтнер объявил о своем уходе из Apple на новую должность в Tesla Motors , где ведущую роль в проекте Swift перейдет ветеран команды Тед Кременек. [42] [43]

Во время WWDC 2019 Apple анонсировала SwiftUI, который обеспечивает основу для декларативного проектирования структуры пользовательского интерфейса на всех платформах Apple. [44]

Официальные загрузки для дистрибутива Ubuntu Linux были доступны начиная с Swift 2.2, с добавлением дополнительных дистрибутивов, начиная с Swift 5.2.4, CentOS и Amazon Linux. [45] Есть и неофициальный пакет для Android. [46]

Языки не поддерживают операционные системы строго, в отличие от связанных библиотек (и компиляторов). Swift официально еще не поддерживается Android, но доступны неофициальные инструменты, такие как Swift Android Toolchain [47], сохраняющие некоторую совместимость с кроссплатформенными программами Apple.

Платформы [ править ]

Платформы, которые поддерживает Swift, - это операционные системы Apple ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows и Android . [47] [48] Также существует неофициальный порт для FreeBSD .

История версий [ править ]

Особенности [ править ]

Swift - альтернатива языку Objective-C, который использует современные концепции теории языков программирования и стремится представить более простой синтаксис. Во время своего появления он был описан просто как «Objective-C без багажа C». [51] [52]

По умолчанию Swift не предоставляет указатели и другие небезопасные средства доступа , в отличие от Objective-C, который повсеместно использует указатели для ссылки на экземпляры объектов. Кроме того, использование Objective-C синтаксиса, подобного Smalltalk, для вызова методов было заменено стилем записи с точками и системой пространств имен , более знакомой программистам из других распространенных объектно-ориентированных (OO) языков, таких как Java или C # . Swift представляет параметры с истинными именами и сохраняет ключевые концепции Objective-C, включая протоколы , замыкания и категории., часто заменяя прежний синтаксис более чистыми версиями и позволяя применять эти концепции к другим языковым структурам, таким как перечисляемые типы (перечисления) [53]

Поддержка закрытия [ править ]

Swift поддерживает замыкания (известные как лямбды на других языках). Вот пример:

// Вот закрытие( arg1 :  Int ,  arg2 :  Int )  ->  Int  в вернуть  arg1  +  arg2

Swift имеет следующий синтаксис закрытия:

// Эта функция принимает замыкание или функцию, которая возвращает int, а затем просто оценивает функцию.func  a ( закрытие  a :  ()  ->  Int )  ->  Int  { вернуться  ()}// Без синтаксиса завершающего закрытияа ( закрытие :  { возврат  1 })// С синтаксисом завершающего закрытияа  { возврат  1 }

Начиная с версии 5.3, Swift поддерживает несколько завершающих замыканий: [54]

// Эта функция передает результат первого замыкания или функции другому и возвращает его результат. func  a ( закрытие  a :  ()  ->  Int ,  anotherClosure :  ( Int )  ->  Int )  ->  Int  {  return  anotherClosure ( a ()) }// Без замыкающих замыканий a ( closure :  { return  1 },  anotherClosure :  { x  in  return  x  +  1 })// С 1 завершающим закрытием a ( closure :  { return  1 })  { x  in  return  x  +  1 })// С двумя замыкающими замыканиями a  { return  1 }  anotherClosure :  { x  in  return  x  +  1 }

Вот критерии синтаксиса завершающего закрытия:

  • Если последними аргументами функции являются замыкания, вы можете использовать синтаксис замыкающего замыкания.
  • Имя параметра первого замыкающего замыкания не указывается.
  • Имена параметров оставшихся замыкающих замыканий нельзя опускать.
  • Если все аргументы, передаваемые функции, являются завершающими замыканиями, вы можете опустить круглые скобки после имени функции.
  • Вызов функции с завершающим замыканием должен заключаться в круглые скобки, если используется в guardинструкции. [55]

Поддержка строк [ править ]

В средах Cocoa и Cocoa Touch многие общие классы были частью библиотеки Foundation Kit . Сюда входила строковая библиотека NSString (с использованием Unicode , UTF-8 в Swift 5, измененная с UTF-16 ), классы коллекций NSArray и NSDictionary и другие. Objective-C предоставил различные биты синтаксического сахара, позволяющие создавать некоторые из этих объектов на лету внутри языка, но после создания объекты управлялись с помощью объектных вызовов. Например, в Objective-C для объединения двух NSStrings требуются вызовы методов, подобные этому:

NSString  * str  =  @ "привет," ; str  =  [ str  stringByAppendingString : @ "мир" ];

В Swift многие из этих базовых типов были перенесены в ядро ​​языка, и ими можно управлять напрямую. Например, строки невидимо связаны с NSString (при импорте Foundation) и теперь могут быть объединены с +оператором, что позволяет значительно упростить синтаксис; предыдущий пример становится: [56]

var  str  =  "привет," str  + =  "world"

Контроль доступа [ править ]

Swift поддерживает пять управления доступом уровней для символов: open, public, internal, fileprivate, и private. В отличие от многих объектно-ориентированных языков, эти элементы управления доступом игнорируют иерархии наследования : privateуказывает, что символ доступен только в непосредственной области , fileprivateуказывает, что он доступен только изнутри файла, internalуказывает, что он доступен внутри содержащего модуля, publicуказывает, что он доступен из любой модуль, и open(только для классов и их методов) указывает, что класс может быть подклассом вне модуля. [57]

Опции и цепочки [ править ]

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

Необязательные типы создаются с помощью этого Optionalмеханизма - чтобы сделать Integer допускающим значение NULL, можно использовать объявление, подобное var optionalInteger: Optional<Int>. Как и в C #, [58] Swift также включает для этого синтаксический сахар, позволяющий указать, что переменная является необязательной, путем размещения вопросительного знака после имени типа var optionalInteger: Int?. [59] Переменные или константы, помеченные как необязательные, либо имеют значение базового типа, либо являются nil. Необязательные типы заключают базовый тип в оболочку, в результате чего создается другой экземпляр. Stringи String?являются принципиально разными типами, у последнего больше общего с Int?чем String.

Чтобы получить доступ к значению внутри, если оно не равно нулю, его необходимо развернуть, чтобы открыть экземпляр внутри. Это выполняется с помощью !оператора:

let  myValue  =  anOptionalInstance !. someMethod ()

В этом случае !оператор разворачивает, anOptionalInstanceчтобы открыть экземпляр внутри, позволяя выполнить для него вызов метода. Если anOptionalInstancenil, возникает ошибка нулевого указателя. На практике это может раздражать, поэтому Swift также включает концепцию необязательной цепочки, чтобы проверить, равен ли экземпляр нулю, а затем развернуть его, если он не равен нулю:

let  myValue  =  anOptionalInstance ?. someMethod ()

В этом случае среда выполнения вызывает, someMethodтолько если anOptionalInstanceне nil, подавляя ошибку. Обычно это требует, чтобы программист myValueперед продолжением проверил , равно ли нулю. Происхождение термина « цепочка» происходит из более распространенного случая, когда несколько вызовов методов / получателей объединяются в цепочку. Например:

пусть  aTenant  =  aBuilding . tenantList [ 5 ] пусть  theirLease  =  aTenant . leaseDetails let  leaseStart  =  theirLease ?. Дата начала

можно свести к:

пусть  leaseStart  =  aBuilding . tenantList [ 5 ]. leaseDetails ?. Дата начала

?Синтаксис обходит пирамиду обреченности .

Swift 2 представил новое ключевое слово guardдля случаев, когда код должен прекратить выполнение, если какое-либо условие не выполнено:

охранник  let  leaseStart  =  aBuilding . TenantList [ 5 ] ?. leaseDetails ?. startDate  else {  // обрабатываем случай ошибки, когда что-либо в цепочке имеет значение nil  // else область видимости должна выйти из текущего метода или цикла } // продолжить, зная, что leaseStart не равно nil

Использование guardимеет три преимущества. Хотя синтаксис может действовать как ifоператор, его основное преимущество заключается в невозможности обнуления. Если в ifзаявлении требуется регистр, он guardпредполагает случай на основе предоставленного условия. Кроме того, поскольку не guardсодержит области видимости, за исключением elseзакрытия, leaseStartона представляется как развернутая необязательная опция для суперобласти защиты. Наконец, если guardпроверка оператора завершилась неудачно, Swift требует, elseчтобы оператор завершил текущий метод или цикл, гарантируя, что leaseStartникогда не будет доступа, когда nil. Это выполняется с помощью ключевых слов return, continue, breakили throw, или путем вызова функции возвращая Never(например fatalError()).

Objective-C был слабо типизирован и позволял вызывать любой метод для любого объекта в любое время. Если вызов метода завершился неудачно, во время выполнения был обработчик по умолчанию, который вернул nil. Это означало, что не нужно было разворачивать или тестировать, эквивалентное утверждение в Objective-C:

leaseStart  =  [[[ aBuilding  tenantList : 5 ]  leaseDetails ]  startDate ]

Вернет nil, и это можно будет проверить. Однако для этого также требовалось, чтобы все вызовы методов были динамическими, что приводило к значительным накладным расходам. Использование опций в Swift предоставляет аналогичный механизм для тестирования и работы с nils, но делает это таким образом, что позволяет компилятору использовать статическую отправку, потому что действие развертывания вызывается в определенном экземпляре (оболочке), а не в диспетчере среды выполнения. система.

Типы значений [ править ]

Во многих объектно-ориентированных языках объекты представлены в двух частях. Объект хранится как блок данных, помещенный в кучу , а имя (или «дескриптор») этого объекта представлено указателем . Объекты передаются между методами путем копирования значения указателя, что позволяет любому, у кого есть копия, получить доступ к одним и тем же базовым данным в куче. Напротив, основные типы, такие как целые числа и значения с плавающей запятой, представлены напрямую; дескриптор содержит данные, а не указатель на них, и эти данные передаются непосредственно в методы путем копирования. Эти стили доступа называются передачей по ссылке в случае объектов и передачей по значению для базовых типов.

Обе концепции имеют свои преимущества и недостатки. Объекты полезны, когда данные большие, например описание окна или содержимое документа. В этих случаях доступ к этим данным обеспечивается путем копирования 32- или 64-битного значения вместо копирования всей структуры данных. Однако меньшие значения, такие как целые числа, имеют тот же размер, что и указатели (обычно оба представляют собой одно слово ), поэтому нет преимущества в передаче указателя по сравнению с передачей значения. Кроме того, передача по ссылке по своей сути требует операции разыменования, которая может привести к заметным накладным расходам в некоторых операциях, обычно тех, которые используются с этими базовыми типами значений, например в математике.

Подобно C # и в отличие от большинства других объектно -ориентированных языков [ необходима цитата ] Swift предлагает встроенную поддержку объектов, использующих семантику передачи по ссылке или передачи по значению, причем первый использует classобъявление, а второй - struct. Структуры в Swift имеют почти все те же функции, что и классы: методы, реализующие протоколы и использование механизмов расширения. По этой причине Apple в целом называет все данные экземплярами , а не объектами или значениями. Однако структуры не поддерживают наследование. [60]

Программист может выбирать, какая семантика больше подходит для каждой структуры данных в приложении. Более крупные структуры, такие как окна, будут определены как классы, что позволит передавать их как указатели. Меньшие структуры, такие как 2D-точка, могут быть определены как структуры, которые будут передаваться по значению и обеспечивать прямой доступ к своим внутренним данным без разыменования. Улучшение производительности, присущее концепции передачи по значению, таково, что Swift использует эти типы почти для всех распространенных типов данных, включая Intи Double, и типы, обычно представленные объектами, такими как Stringи Array. [60] Использование типов значений также может привести к значительному повышению производительности пользовательских приложений. [61]

Чтобы гарантировать, что даже самые большие структуры не вызывают потери производительности при передаче, Swift использует копирование при записи, так что объекты копируются только в том случае, если и когда программа пытается изменить в них значение. Это означает, что различные средства доступа фактически имеют указатель на одно и то же хранилище данных. Таким образом, хотя данные физически хранятся как один экземпляр в памяти, на уровне приложения эти значения являются отдельными, и физическое разделение осуществляется путем копирования при записи только в случае необходимости. [62]

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

Ключевой особенностью Objective-C является поддержка категорий , методов, которые могут быть добавлены для расширения классов во время выполнения. Категории позволяют расширять классы на месте для добавления новых функций без необходимости создавать подклассы или даже иметь доступ к исходному исходному коду . Примером может быть добавление поддержки проверки орфографии к базовому NSStringклассу, что означает, что все экземпляры NSString в приложении улучшают проверку орфографии. Система также широко используется в качестве организационного метода, позволяющего собирать связанный код в расширения, подобные библиотеке. Swift продолжает поддерживать эту концепцию, хотя теперь они называются расширениями и объявляются с ключевым словомextension. В отличие от Objective-C, Swift также может добавлять новые методы доступа к свойствам, типы и перечисления к существующим экземплярам [ необходима ссылка ] .

Еще одна ключевая особенность Objective-C - это использование протоколов , известных на большинстве современных языков как интерфейсы . Протоколы обещают, что конкретный класс реализует набор методов, а это означает, что другие объекты в системе могут вызывать эти методы для любого объекта, поддерживающего этот протокол. Это часто используется в современных объектно-ориентированных языках в качестве замены множественного наследования , хотя наборы функций не совсем схожи. Типичным примером протокола в Какао является NSCopyingпротокол, который определяет один метод copyWithZone, который реализует глубокое копирование объектов. [63]

В Objective-C и большинстве других языков, реализующих концепцию протокола, программист должен обеспечить реализацию необходимых методов в каждом классе. [64] Swift добавляет возможность добавлять эти методы с помощью расширений и использовать универсальное программирование (generics) для их реализации. В совокупности они позволяют писать протоколы один раз и поддерживают большое количество экземпляров. Кроме того, механизм расширения может использоваться для добавления соответствия протоколу к объекту, который не перечисляет этот протокол в своем определении. [63]

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

протокол  StringConvertible {  func  toString ()  ->  String }

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

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

В Swift, как и во многих современных языках, поддерживающих интерфейсы, протоколы могут использоваться как типы, что означает, что переменные и методы могут определяться протоколом, а не их конкретным типом:

var  someSortOfPrintableObject :  StringConvertible ... print ( someSortOfPrintableObject . toString ())

Неважно, что это за экземпляр someSortOfPrintableObject, компилятор гарантирует, что он соответствует протоколу, и, таким образом, этот код безопасен. Этот синтаксис также означает, что коллекции могут также основываться на протоколах, например let printableArray = [StringConvertible].

Поскольку Swift рассматривает структуры и классы как аналогичные концепции, как расширения, так и протоколы широко используются в среде выполнения Swift для предоставления богатого API, основанного на структурах. Например, Swift использует расширение, чтобы добавить Equatableпротокол ко многим своим базовым типам, таким как строки и массивы, что позволяет сравнивать их с ==оператором. Конкретный пример того, как взаимодействуют все эти функции, можно увидеть в концепции реализаций протокола по умолчанию :

func  ! = < T  :  Equatable > ( lhs :  T ,  rhs :  T )  ->  Bool

Эта функция определяет метод, который работает с любым экземпляром, соответствующим Equatable, обеспечивая функцию не равно . Любой экземпляр, класс или структура автоматически получает эту реализацию, просто подчиняясь Equatable. Поскольку многие экземпляры выигрывают за Equatableсчет своих базовых реализаций или других общих расширений, большинство основных объектов во время выполнения выигрывают равными, а не равными без кода. [65]

Эта комбинация протоколов, значений по умолчанию, наследования протоколов и расширений позволяет реализовать многие функции, обычно связанные с классами и наследованием, для типов значений. [63] При правильном использовании это может привести к значительному повышению производительности без значительных ограничений в API. Эта концепция настолько широко используется в Swift, что Apple стала называть ее языком программирования, ориентированным на протокол . Они предлагают решать многие проблемные области, которые обычно решаются с помощью классов и наследования, используя вместо этого протоколы и структуры.

Библиотеки, среда выполнения и разработка [ править ]

В системах Apple Swift использует ту же среду выполнения, что и существующая система Objective-C , но требует iOS 7 или macOS 10.9 или выше. Это также зависит от Grand Central Dispatch . [66] Код Swift и Objective-C можно использовать в одной программе, а также в расширении C и C ++. В отличие от C, код C ++ нельзя использовать непосредственно из Swift. Оболочка Objective-C или C должна быть создана между Swift и C ++. [67] В случае Objective-C Swift имеет значительный доступ к объектной модели и может использоваться для создания подклассов, расширения и использования кода Objective-C для обеспечения поддержки протокола. [68] Обратное неверно: класс Swift нельзя разделить на подклассы в Objective-C. [69]

Чтобы облегчить разработку таких программ и повторное использование существующего кода, Xcode 6 и выше предлагает полуавтоматическую систему, которая создает и поддерживает заголовок моста, чтобы предоставить Swift-код Objective-C. Это принимает форму дополнительного файла заголовка, который просто определяет или импортирует все символы Objective-C, необходимые для кода Swift проекта. В этот момент Swift может ссылаться на типы, функции и переменные, объявленные в этом импорте, как если бы они были написаны на Swift. Код Objective-C также может использовать код Swift напрямую, импортируя автоматически поддерживаемый файл заголовка с объявлениями Objective-C символов Swift проекта. Например, файл Objective-C в смешанном проекте под названием «MyApp» может обращаться к классам или функциям Swift с помощью кода.#import "MyApp-Swift.h". Однако не все символы доступны через этот механизм - использование специфических для Swift функций, таких как общие типы, необъектные дополнительные типы, сложные перечисления или даже идентификаторы Unicode, может сделать символ недоступным для Objective-C. [70]

Swift также имеет ограниченную поддержку атрибутов , метаданных, которые считываются средой разработки и не обязательно являются частью скомпилированного кода. Как и в Objective-C, атрибуты используют @синтаксис, но доступный в настоящее время набор невелик. Одним из примеров является @IBOutletатрибут, который отмечает данное значение в коде как выход , доступный для использования в Interface Builder (IB). Выпускное отверстие представляет собой устройство , которое связывает значение отображения на экране к объекту в коде.

В системах, отличных от Apple, Swift не зависит от среды выполнения Objective-C или других системных библиотек Apple; их заменяет набор реализаций Swift "Corelib". К ним относятся «swift-corelibs-foundation» для замены Foundation Kit , «swift-corelibs-libdispatch» для замены Grand Central Dispatch и «swift-corelibs-xctest» для замены XCTest API из XCode . [71]

Начиная с 2019 года, с XCode 11 Apple также добавила основную новую парадигму пользовательского интерфейса под названием SwiftUI. SwiftUI заменяет старую парадигму Interface Builder новой парадигмой декларативной разработки. [72]

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

Swift использует автоматический подсчет ссылок (ARC) для управления памятью . Раньше Apple требовала ручного управления памятью в Objective-C, но представила ARC в 2011 году, чтобы упростить выделение и освобождение памяти. [73] Одной из проблем с ARC является возможность создания цикла сильных ссылок , где объекты ссылаются друг на друга таким образом, что вы можете достичь объекта, с которого вы начали, следуя ссылкам (например, A ссылается на B, B ссылается на A). Это заставляет их просачиваться в память, поскольку они никогда не освобождаются. Swift предоставляет ключевые слова weakи unownedпредотвращает сильные ссылочные циклы. Обычно отношения родитель-потомок будут использовать сильную ссылку, в то время как дочерний-родитель будет использовать либоweakссылка, где родители и дети могут не быть связаны или unownedгде у ребенка всегда есть родитель, но у родителя может не быть ребенка. Слабые ссылки должны быть необязательными переменными, поскольку они могут меняться и становиться nil. [74]

Замыкание внутри класса также может создать цикл сильных ссылок, фиксируя ссылки на себя. Ссылки на себя, которые должны рассматриваться как слабые или не имеющие владельца, могут быть указаны с помощью списка захвата.

Отладка и другие элементы [ править ]

Ключевым элементом системы Swift является ее способность аккуратно отлаживаться и запускаться в среде разработки с использованием цикла чтения – оценки – печати (REPL), что придает ей интерактивные свойства, более общие со способностями Python к написанию сценариев, чем с традиционным системным программированием. языков. REPL еще более усовершенствован за счет новой концепции игровых площадок . Это интерактивные представления, работающие в среде Xcode, которые оперативно реагируют на изменения кода или отладчика. [75] Детские площадкипозволяют программистам добавлять код Swift вместе с документацией по уценке. Если какой-то код изменяется с течением времени или в отношении какого-либо другого ранжированного входного значения, представление можно использовать с помощником по временной шкале для демонстрации вывода в анимированной форме. Кроме того, Xcode имеет функции отладки для разработки Swift, включая точки останова, инструкции пошагового выполнения и обхода, а также разбивку размещения элементов пользовательского интерфейса для разработчиков приложений.

Apple утверждает, что Swift - это «язык программирования промышленного качества, столь же выразительный и приятный, как язык сценариев». [76]

Производительность [ править ]

Многие из функций, представленных в Swift, имеют хорошо известные компромиссы с производительностью и безопасностью. Apple реализовала оптимизацию , уменьшающую эти накладные расходы. [77]

Сравнения с другими языками [ править ]

Swift считается языком программирования семейства C и во многом похож на C:

  • Большинство операторов C используются в Swift, но есть несколько новых операторов, например, для поддержки целочисленных операций с переполнением (см. Раздел «Различия»).
  • Фигурные скобки используются для группировки операторов.
  • Переменные назначаются с использованием знака равенства , но сравниваются с использованием двух последовательных знаков равенства . Новый оператор идентификации === предназначен для проверки, относятся ли два элемента данных к одному и тому же объекту .
  • Управляющие операторы while, ifи switchаналогичны, но имеют расширенные функции, например, a, switchкоторый принимает нецелочисленные регистры whileи ifподдерживает сопоставление с образцом и условное разворачивание опций, forиспользует синтаксис.for i in 1...10
  • Квадратные скобки используются с массивами как для их объявления, так и для получения значения по заданному индексу в одном из них.

Он также имеет сходство с Objective-C:

  • Основные числовые типы ( Int, UInt, Float, Double)
  • Методы класса наследуются, как и методы экземпляра; selfв методах класса - это класс, для которого был вызван метод.
  • Похожий for... inсинтаксис перечисления.

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

  • Операторы не обязательно должны заканчиваться точкой с запятой ( ;), хотя они должны использоваться, чтобы разрешить более одного оператора в строке.
  • Нет файлов заголовков.
  • Использует вывод типа .
  • Общее программирование .
  • Функции - это первоклассные объекты.
  • С вариантами перечисления могут быть связаны данные ( алгебраические типы данных ).
  • Операторы могут быть переопределены для классов ( перегрузка операторов ), а также могут быть определены новые операторы.
  • Строки полностью поддерживают Юникод . Большинство символов Юникода можно использовать как в идентификаторах, так и в операторах.
  • Нет обработки исключений . Swift 2 представляет другую несовместимую модель обработки ошибок. [78]
  • Некоторые особенности более ранних языков C-семейства , которыми легко злоупотреблять, были удалены:
    • По умолчанию указатели не отображаются. Программисту нет необходимости отслеживать и отмечать имена для ссылки или разыменования.
    • Назначения не возвращают значения. Это предотвращает распространенную ошибку записи i = 0вместо того i == 0, чтобы вызывать ошибку времени компиляции.
    • Нет необходимости использовать breakоператоры в switchблоках. Отдельные случаи не переходят к следующему, если не используется fallthroughоператор.
    • Переменные и константы всегда инициализируются, а границы массива всегда проверяются.
    • Целочисленные переполнения , которые приводят к неопределенному поведению для целых чисел со знаком в C, улавливаются как ошибка времени выполнения в Swift. Программисты могут выбрать , чтобы позволить переполняется, используя специальные арифметические операторы &+, &-, &*, &/и &%. Свойства minи maxопределены в Swift для всех целочисленных типов и могут использоваться для безопасной проверки возможных переполнений, вместо того, чтобы полагаться на константы, определенные для каждого типа во внешних библиотеках.
    • Форма ifи while, состоящая из одного оператора , которая позволяет опускать фигурные скобки вокруг оператора, не поддерживается.
    • Перечисление в стиле C for (int i = 0; i < c; i++), которое часто приводит к ошибкам , не поддерживаются (начиная с Swift 3 и далее). [79]
    • Операторы пре- и пост- инкремента и декремента ( i++, --i...) не поддерживаются (начиная с Swift 3 и далее), тем более что forоператоры в стиле C также не поддерживаются в Swift 3 и далее. [80]

Разработка и другие реализации [ править ]

Поскольку язык является открытым, есть перспективы его переноса в Интернет. [81] Некоторые веб - структуры уже разработаны, такие как IBM «s Kitura , Совершенный и Vapor .

Официальная рабочая группа «Серверные API-интерфейсы» также была создана Apple [82], в которой члены сообщества разработчиков Swift играют центральную роль. [83]

Вторая свободная реализация Swift , что цели какао , Microsoft «s Common Language Infrastructure ( .NET ), а также Java и Android платформы существует как часть элементов компилятора от RemObjects программного обеспечения . [84]

Комбинируя инструменты из LLVM и Macintosh Programmer's Workshop , можно запустить очень небольшое подмножество языка в Mac OS 9 . [85]

См. Также [ править ]

  • Сравнение языков программирования
  • Цель-C
  • Котлин (язык программирования)
  • Python (язык программирования)
  • Ним (язык программирования)

Ссылки [ править ]

  1. ^ Патент США № 9329844
  2. ^ «Свифт достиг 1.0» . Яблоко. 9 сентября 2014 . Проверено 8 марта 2015 года .
  3. ^ "Выпуск 5.3.3" .
  4. ^ https://forums.swift.org/t/swift-5-4-release-process/41936
  5. ^ "Быстро, объективно" . Swift является проприетарным и закрытым: он полностью контролируется Apple, и его реализация с открытым исходным кодом отсутствует.
  6. ^ Lattner, Крис (11 июня 2014). «Re: [LLVMdev] [cfe-dev] [Реклама] вакансии в команде разработчиков Apple Swift» . Архивировано из оригинального 14 июля 2014 года . Проверено 12 июня 2014 года . Вы можете себе представить, что многие из нас хотят, чтобы он был с открытым исходным кодом и был частью LLVM, но обсуждения еще не было и не будет в ближайшее время.
  7. ^ Lattner, Крис (3 июня 2014). "Домашняя страница Криса Латтнера" . Крис Латтнер . Проверено 3 июня 2014 года . Язык Swift - продукт неустанных усилий команды лингвистических экспертов, гуру документации, ниндзя по оптимизации компиляторов и невероятно важной внутренней группы экспертов, которые предоставили отзывы, чтобы помочь усовершенствовать и протестировать идеи в боевых условиях. Конечно, он также очень выиграл от опыта, с трудом завоеванного многими другими языками в этой области, черпая идеи из Objective-C, Rust, Haskell, Ruby, Python, C #, CLU и слишком многих других, чтобы перечислить.
  8. ^ a b Латтнер, Крис (3 июня 2014 г.). "Домашняя страница Криса Латтнера" . Крис Латтнер . Проверено 3 июня 2014 года . Я начал работу над языком программирования Swift в июле 2010 года. Я реализовал большую часть базовой структуры языка, и лишь несколько человек знали о ее существовании. Несколько других (удивительных) людей начали всерьез вносить свой вклад в конце 2011 года, и это стало основным направлением для группы Apple Developer Tools в июле 2013 года, [...] черпая идеи из Objective-C , Rust, Haskell, Ruby, Python, C #, CLU и многие другие, чтобы перечислить.
  9. ^ «Создание assert () в Swift, часть 2: __FILE__ и __LINE__» . Проверено 25 сентября 2014 года .
  10. ^ "Влияния - Ссылка на ржавчину" . doc.rust-lang.org . Проверено 2 мая 2020 года .
  11. ^ "Порт Swift Linux" . Swift.org . Apple , Inc . Проверено 3 августа 2016 года .
  12. ^ Timmer, Джон (5 июня 2014). «Быстрый взгляд на Swift, новый язык программирования Apple» . Ars Technica . Condé Nast . Проверено 6 июня 2014 года .
  13. ^ Протоколно-ориентированное программирование в Swift . Apple , Inc . YouTube .
  14. ^ «Концепции похожи на черты ржавчины» .
  15. Уильямс, Оуэн (2 июня 2014 г.). «К шестидесятилетию со дня рождения Тима Бернерса-Ли Apple представляет Swift, новый язык программирования для iOS» . Следующая Сеть . Проверено 2 июня 2014 года .
  16. ^ «Новый язык программирования Apple Swift теперь имеет открытый исходный код» . Грань . Проверено 5 декабря 2015 года .
  17. ^ «Apple Open Sources Swift в новейшей версии для предприятий» . CIO Journal. Блоги Wall Street Journal . 3 декабря 2015 . Проверено 5 декабря 2015 года .
  18. ^ «Оглядываясь назад на Swift 3 и вперед на Swift 4» . Форумы Swift . Проверено 19 ноября 2018 года .
  19. ^ «Быстрая эволюция» . Быстрая эволюция . Проверено 19 ноября 2018 года .
  20. ^ «Рейтинг языков программирования RedMonk: январь 2018 - tecosystems» . redmonk.com . Проверено 20 ноября 2018 года .
  21. ^ Kremenek, Ted (25 марта 2019). "Swift 5 выпущен!" .
  22. ^ Kremenek, Ted (20 сентября 2019). "Выпущен Swift 5.1!" .
  23. ^ a b Платформы State of the Union, сессия 102, Всемирная конференция разработчиков Apple , 2 июня 2014 г.
  24. ^ Язык программирования Swift . Apple . 2 июня 2014 . Проверено 2 июня 2014 года . Выложите резюме .
  25. ^ «Свифт достиг 1.0» . 9 сентября 2014 . Проверено 10 сентября 2014 года .
  26. ^ «Примечания к выпуску Xcode 6.1» . 22 октября 2014 . Проверено 23 января 2015 года .
  27. ^ «Примечания к выпуску Xcode 6.3» . 8 апреля 2015 года . Проверено 8 апреля 2015 года .
  28. ^ «Приложения Swift 2 в App Store» . Блог Swift . Проверено 13 марта 2016 года .
  29. ^ Inc., Apple (13 сентября 2016 г.). «Выпущен Swift 3.0!» . Swift.org . Проверено 26 октября, 2016 .
  30. ^ Inc., Apple (17 сентября 2017 г.). "Выпущен Swift 4.0!" . Swift.org . Проверено 1 марта 2018 года .
  31. ^ Inc., Apple (29 марта 2018 г.). "Выпущен Swift 4.1!" . Swift.org . Проверено 30 марта 2018 года .
  32. ^ «Результаты опроса разработчиков Stack Overflow 2015» .
  33. ^ «Результаты опроса разработчиков Stack Overflow 2016» .
  34. ^ «Swift.org и открытый исходный код» . Swift.org . Apple , Inc . Проверено 25 февраля 2019 года .
  35. ^ «Представляем IBM Swift Sandbox - Swift» . Свифт . Проверено 5 декабря 2015 года .
  36. ^ Мэйо, Бенджамин. «Напишите код Swift в веб-браузере с помощью IBM Swift Sandbox» . 9to5Mac . Проверено 5 декабря 2015 года .
  37. ^ «После того, как Apple откроет исходный код, IBM перенесет программирование на Swift в облако | ZDNet» . ZDNet . Проверено 5 декабря 2015 года .
  38. ^ «Каталог пакетов Swift и устаревание песочницы Swift» . Проверено 9 ноября 2018 года .
  39. ^ "Swift Playgrounds" . Разработчик Apple . Проверено 19 июня, 2016 .
  40. ^ «Swift Playgrounds - Предварительный просмотр» . Apple . Проверено 19 июня, 2016 .
  41. Мэйо, Бенджамин (13 июня 2016 г.). «Apple анонсирует Swift Playgrounds для iPad на WWDC, публичный релиз осенью» . 9to5Mac . Проверено 19 июня, 2016 .
  42. Каннингем, Эндрю (10 января 2017 г.). «Давний программист Apple и создатель Swift покидает Apple в пользу Tesla» . Ars Technica.
  43. ^ Wuerthele, Майк (13 января 2017). «Глава нового проекта Swift Тед Кременек сказал, что какое-то время будет управлять шоу за кулисами» . AppleInsider.
  44. Среда, Дэниел Эран Дилгер; 19 июня; 2019; Тихоокеанское время, 11:26. «WWDC19: SwiftUI был самой яркой звездой в плеяде новых идей» . AppleInsider . Проверено 19 июля 2019 года .CS1 maint: numeric names: authors list (link)
  45. ^ "Swift.org - Загрузить Swift" . Проверено 21 июня 2020 года .
  46. ^ "Пакет swift - termux" . Проверено 21 июня 2020 года .
  47. ^ a b Readdle (15 января 2020 г.). «Swift для Android: наш опыт и инструменты» . Средний . Проверено 20 августа 2020 года .
  48. Андерсон, Тим (30 марта 2020 г.). «Официальная поддержка Swift для Windows, обещанная в версии 5.3: Swift на других платформах - при условии, что вам не нужен графический интерфейс» . Реестр . Проверено 18 сентября 2020 года .
  49. ^ Kremenek, Ted (25 марта 2019). "Swift 5 выпущен!" . Swift.org . Проверено 28 марта 2019 года .
  50. ^ "Загрузить Swift" . Swift.org . Apple . Проверено 15 декабря 2020 года .
  51. Мец, Рэйчел (3 июня 2014 г.). «Apple ищет быстрый способ привлечь больше разработчиков» . Обзор технологий .
  52. Рианна Вебер, Харрисон (2 июня 2014 г.). «Apple анонсирует Swift, новый язык программирования для macOS и iOS» . VentureBeat .
  53. ^ «Преимущества использования Swift» . themindstudios.com . Проверено 24 февраля 2017 года .
  54. ^ Макомбер, Кайл; Яскевич, Явель; Грегор, Дуг; Макколл, Джон. «Множественные трейлинг-закрытия» . GitHub . Проверено 19 октября 2020 года .
  55. ^ Латтнер, Крис. «Разрешить скользящее закрытие в условиях» . GitHub . Проверено 19 октября 2020 года .guard
  56. ^ «Строки и символы» . developer.apple.com . Apple , Inc. Retrieved июля +16, 2 014 .
  57. ^ «Контроль доступа» . developer.apple.com . Apple , Inc. Retrieved +25 октября, +2016 .
  58. ^ «Типы, допускающие значение NULL» , Руководство по программированию на C #, Microsoft.
  59. ^ «Виды» . developer.apple.com . Apple , Inc. Проверен Июль +16, +2014 .
  60. ^ a b «Классы и структуры» . Apple.com .
  61. ^ Гухит, Фил. «Пример производительности Swift 1.1, Swift 1.2 и Objective-C» .
  62. ^ Создание лучших приложений с типами значений . Яблоко.
  63. ^ a b c «Справочник по протоколу NSCopying» . Apple .
  64. ^ «Работа с протоколами» . Apple .
  65. ^ Томпсон, Мэтт (2 сентября 2014 г.). «Реализации протокола Swift по умолчанию» . NSHipster .
  66. ^ "Работают ли приложения на основе Swift в macOS 10.9 / iOS 7 и ниже?" , Переполнение стека
  67. ^ «Использование Swift с Какао и Objective-C: Базовая установка» . apple.com . 6 января 2015 года.
  68. ^ «Написание классов Swift с поведением Objective-C» , Apple Inc.
  69. ^ «Перенос кода Objective-C на Swift» .
  70. ^ «Swift и Objective-C в одном проекте» , Apple Inc.
  71. ^ "Apple: поиск" corelib " " . GitHub .
  72. ^ «Xcode - SwiftUI - разработчик Apple» . developer.apple.com . Проверено 1 февраля 2021 года .
  73. ^ «Автоматический подсчет ссылок» , Apple Inc.
  74. ^ Ланье, Брайан; Грофф, Джо. «Промежуточный стриж» . Apple . Проверено 3 июля 2014 года .
  75. ^ Мец, Кейд. «Почему программисты отказываются от нового языка программирования Apple» . Проводной . Проверено 16 июля 2014 года .
  76. ^ О Swift , Apple Inc.
  77. ^ «Оптимизация быстрой производительности» . Apple, Inc., июнь 2015 г.
  78. ^ «Обработка ошибок на Swift-Language» . stackoverflow.com .
  79. ^ "яблоко / быстрая эволюция" . GitHub . Проверено 4 апреля 2016 года .
  80. ^ "яблоко / быстрая эволюция" . GitHub . Проверено 4 апреля 2016 года .
  81. Барбоза, Грег (22 февраля 2016 г.). «IBM переносит Swift в облако, выпускает веб-фреймворк Kitura, написанный на языке программирования Apple» . 9to5Mac . Проверено 16 мая, 2016 .
  82. ^ Inc., Apple (25 октября 2016 г.). «Рабочая группа по серверным API» . Swift.org . Проверено 28 октября, 2016 .
  83. ^ Inc., Apple. "Swift.org" . Swift.org . Проверено 28 октября, 2016 .
  84. ^ "Компилятор элементов RemObjects" . Проверено 17 января, 2016 .
  85. Роуз, Иордания (1 апреля 2020 г.). «Swift для Mac OS 9» . -dealloc .

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Swift в Apple Developer
  • Исходный код Swift на GitHub
  • Серверный Swift
  • Быстрый пример
  • Серверный Swift - Фреймворк Vapor