Перейти к содержимому

Swift язык программирования для чего используется

  • автор:

Swift

Swift — это язык программирования от компании Apple с открытым исходным кодом. Предназначен для разработки приложений для iOS и macOS, реже используется в других проектах.

Освойте профессию «iOS-разработчик»

Язык появился всего в 2014 году как альтернатива Objective-C. Сначала Swift был закрытым, потом Apple открыла его исходный код. Идея заключалась в том, чтобы ускорить разработку, сделать ее удобнее, а код — понятнее.

Swift — компилируемый язык. Это значит, что программа запускается не построчно. Перед запуском она полностью переводится в машинные коды с помощью специального ПО — компилятора. Благодаря этому приложения работают быстрее. Компилятор для Swift входит в среду программирования XCode, предназначенную для macOS.

Язык высокоуровневый: это значит, что код на нем ближе к человеческим понятиям, чем к машинным кодам.

Название читается как «Свифт».

13 месяцев
iOS-разработчик

Создавайте приложения, которые выйдут в топ App Store

Кто пользуется языком Swift

  • Мобильные разработчики, которые программируют под iOS.
  • Разработчики приложений под операционную систему macOS.
  • Геймдев-разработчики, которые создают игры под системы Apple.
  • Бэкенд-разработчики сайтов, работающие с веб-библиотеками Swift.

Для чего нужен язык

  • Для создания приложений для систем macOS или iOS. Этот язык преимущественно используется в разработке под устройства Apple.
  • Для совместного использования с C и Objective-C — Swift работает вместе с этими языками. На Objective-C написан старый код приложений.
  • Для поддержки серверной части сайтов и веб-приложений. Это редкий вариант использования Swift, но возможный благодаря специальным библиотекам — они расширяют возможности языка и адаптируют его под веб.

Характеристики Swift

Мультипарадигменность. Это значит, что язык подходит для разных принципов программирования: функционального, объектно-ориентированного, императивного.

Статическая типизация. Переменной присваивается тип на все время ее существования. Если она содержит число, то в нее не получится записать строку или массив.

Необязательное объявление типов. Можно объявить переменную и не указывать ее тип напрямую. Компилятор поймет его по данным, которые в нее запишут. Если создать переменную A и сразу присвоить ей значение 10, она автоматически считается как целое число.

Станьте iOS-разработчиком — работайте
в штате, на фрилансе или запускайте собственные приложения

Преимущества

Высокая скорость. Swift назван в честь стрижа, одной из самых быстрых птиц. Его основное преимущество — скорость и производительность. Apple утверждает, что язык в 2,6 раза быстрее Objective-C и в 8,4 раза быстрее Python 2.7. Для некоторых алгоритмов он превосходит C++. Благодаря высокой скорости исполнения кода приложения на Swift работают быстро. При этом они производительны и не перегружают вычислительные мощности.

Автоматическое управление памятью. Система Automatic Reference Counting (ARC) сама выделяет, расходует и очищает память. Программисту не нужно за ней следить.

Явная обработка null. Значение null обрабатывается так, чтобы код был безопаснее.

Понятный код. Swift — язык с простым и неперегруженным синтаксисом. Благодаря этому в коде проще разобраться. Создатели языка постоянно стараются сделать его понятнее. В нем нет громоздких конструкций, обилия скобок и запятых. Swift похож на естественный язык, остается чистым и выразительным даже при написании сложного кода. Неочевидные ошибки встречаются реже, чем в классических C-подобных языках.

Безопасность. Благодаря продвинутой работе с памятью Swift безопаснее Objective-C и исключает несанкционированный доступ к данным. Он точнее отслеживает ошибки программиста, поэтому снижается риск незаметных, но критичных багов. Swift предсказуем — это важно при отладке или тестировании.

Открытый исходный код. Swift могут бесплатно использовать разработчики, преподаватели и студенты по лицензии на распространение ПО с открытым исходным кодом Apache 2.0. Двоичные файлы для OS X и Linux позволяют компилировать код для iOS, OS X, watchOS, tvOS и Linux. Это необычное решение для Apple, которая известна закрытостью своего софта. Чтобы ускорить развитие и превращение Swift в более мощный язык, существует сообщество, где пользователи могут напрямую вносить вклад в исходный код Swift.

Благодаря открытости Swift можно портировать на сторонние системы, создавать библиотеки и фреймворки, которые расширяют язык. Но большинство возможностей Swift все равно доступно только на устройствах Apple.

Дополнительные возможности от Apple. Корпорация постоянно поддерживает язык: держит в открытом доступе понятные обучающие материалы, обновляет версии. Встроенная в macOS среда разработки XCode поддерживает Swift «из коробки», а для визуальных приложений есть удобный инструмент Apple Swift Playgrounds. Это «песочница», в которой можно тренироваться создавать приложения. Она доступна для macOS и для iOS версий 10 и выше.

На сайте компании можно просмотреть документацию, а в магазине книг Apple Books доступен официальный учебник по языку Swift.

Недостатки

Узкая специализация. Swift используется преимущественно для разработки под устройства Apple. Других применений у языка нет, за очень редкими исключениями. Это ограничивает его применение.

Необходимость использования техники Apple. Swift под Windows или Linux — технически возможное, но неудобное и неполноценное решение. Разработка на этом языке обычно происходит в экосистеме Apple в среде программирования XCode. Для macOS и iOS есть библиотеки и другие компоненты для разработки на Swift, которых нет в прочих ОС. Поэтому для комфортной работы потребуется устройство Apple. Оно должно быть мощным: запуск и сборка написанных приложений — ресурсоемкие процессы.

Небольшое ру-комьюнити. Swift — нишевый язык, которым пользуются только при разработке под устройства Apple. Поэтому у него не настолько широкое комьюнити, как у универсальных языков программирования. Но этот минус компенсируют открытые обучающие материалы от Apple, доступные на официальном сайте. Также вместе со Swift можно быстрее выучить английский язык — на нем очень много лекций и туториалов.

Плохая поддержка старых версий. Старые версии систем iOS и macOS, которые существовали до выхода Swift, не поддерживаются. Могут возникнуть проблемы и с обратной совместимостью, то есть с совместной работой с более старыми версиями языка.

Сильная связь с Objective-C. Это одновременно и плюс, и минус. Код на Swift легко встраивается в программы, написанные на Objective-C, и это дает большую гибкость при разработке. Но новичкам потребуется освоить не один, а два языка. Без этого писать на Swift будет сложнее.

Пример кода на языке Swift

Традиционная «первая программа» выводит в консоль фразу «Hello, world», или же «Привет, мир». В Swift она пишется так: print («Hello, World»)

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

Вместо print можно использовать команду println — она автоматически подставляет в конец фразы перенос на новую строку.

С чего начать изучение

Swift по умолчанию есть в IDE XCode, ее можно скачать бесплатно в App Store. Для Windows и Linux потребуется либо эмулировать macOS, либо использовать портированные версии от энтузиастов.

Чтобы писать простые учебные программы, достаточно знать базовый синтаксис. Для серьезной разработки под macOS или iOS понадобится изучить основы работы этих систем, а желательно еще и ознакомиться с Objective-C: на нем по-прежнему работает много старых приложений.

iOS-разработчик

Получите перспективную профессию: освойте с нуля программирование на Swift, мобильную разработку и UX/UI для iOS. За время обучения вы сделаете 5 приложений для портфолио и примете участие в трех хакатонах

картинка (95)

Статьи по теме:
Мобильный разработчик о том, как pet-проекты открывают двери в Сбербанк и МТС
Почему Objective-C потерял актуальность и за какими языками будущее

И бонус — инструкции, как попасть на собеседование, получить оффер в топовой компании и сварить яйцо в микроволновке

Язык программирования Swift. Русская версия

image

Привет, Хабр! 2 июня все мы воочию могли наблюдать, как компания Apple начала творить революцию в стане Objective-C разработчиков, представив миру свой новый язык программирования – Swift. Вместе с этим, она выложила в открытый доступ небольшую документацию по языку, которую мы решили перевести, если на то будет спрос. Предлагаем вашему вниманию перевод первой главы. Если тема будет интересна, то мы продолжим публиковать перевод каждую неделю.

Оглавление

Добро пожаловать в Swift
О Swift
Введение в Swift

Language guide
The Basics
Basic Operators
String and Characters
Collection Types
Control Flow
Functions
Closures
Enumerations
Classes and Structures
Properties
Methods
Subscripts
Inheritance
Initialization
Deinitialization
Automatic Reference Counting
Optional Chaining
Type Casting
Nested Types
Extensions
Protocols
Generics
Advanced Operators

Language Reference
About the Language Reference
Lexical Structure
Types
Expressions
Statements
Declarations
Attributes
Patterns
Generic Parameters and Arguments
Summary of the Grammar
Trademarks

Добро пожаловать в Swift
О языке Swift

Swift – это новый язык программирования для разработки iOS и OS X приложений, который сочетает в себе все лучшее от C и Objective-C, но лишен ограничений, накладываемых в угоду совместимости с C. В Swift используются паттерны безопасного программирования и добавлены современные функции, превращающие создание приложения в простой, более гибкий и увлекательный процесс. Swift, созданый нами с чистого листа, – это возможность заново представить себе, как разрабатываются приложения.

Swift разрабатывался нами несколько лет. Основой нового языка программирования послужили существующие компилятор, отладчик и фреймворки. Мы упростили процесс управления памятью с помощью механизма автоматического подсчета ссылок – Automatic Reference Counting (ARC). Наши фреймворки также подверглись серьезной модернизации. Objective-C начал поддерживать блоки, литералы и модули – все это создало благоприятные условия для внедрения современных технологий. Именно эта подготовительная работа послужила фундаментом для нового языка программирования, который будет применяться для разработки будущих программных продуктов для Apple.

Разработчикам Objective-C Swift покажется знакомым. Он сочетает в себе читабельность именованных параметров и мощь динамической объектной модели Objective-C. Он открывает доступ к уже существующим фреймворкам Cocoa и совместим с кодом, написанным на Objective-C. Построенный на этой общей основе язык предлагает множество новых возможностей и унифицирует процедурные и объектно-ориентированные аспекты языка программирования.

Swift не отпугнет и начинающих программистов. Это первый мощный язык программирования, такой же понятный и увлекательный, как скриптовый язык. Он поддерживает так называемые playground-ы, которые позволяют программистам экспериментировать с кодом, видя результат в режиме реального времени без необходимости компилировать и запускать приложение.

Swift вобрал в себя все лучшее от современных языков и разработан с учетом обширного опыта компании Apple. Наш компилятор – синоним производительности, наш язык оптимизирован для разработки без оглядки на компромиссы. Он спроектирован таким образом, чтобы вы смогли легко разработать и ваше первое приложение «hello, world!», и даже целую операционную систему. Все это делает Swift важным инструментом для разработчиков и для самой компании Apple.

Swift – это новый фантастический способ создавать приложения для iOS и OS X, и мы продолжим развивать его, добавляя новый функционал и представляя новые возможности. Наша цель – амбициозна. И мы с нетерпением ждем, чтобы увидеть, что вы сумеете создать при помощи него.

Введение в Swift

По давней традиции первая программа на новом языке должна выводить на экран слова “Hello, world” . С помощью Swift это делается так:

println("Hello, world") 

Если вы когда-нибудь разрабатывали на C или Objective-C этот синтаксис должен казаться вам до боли знакомым – в Swift эта строчка кода является законченной программой. Вам больше не нужно импортировать отдельные библиотеки для обеспечения базового функционала вроде ввода/вывода в консоль или работы со строками. Код, написанный в глобальной области видимости, является точкой входа в программу, таким образом функция main больше не нужна. Также обратите внимание на отсутствие точки с запятой в конце каждой строки.

Это введение содержит достаточно информации, чтобы начать писать код на Swift. Не переживайте, если вам будет что-то непонятно – мы все детально объясним в последующих главах.

Замечание
Для лучшего понимания материала мы рекомендуем использовать режим playground в Xcode. Playground позволяет вам видеть результат сразу в процессе редактирования кода без необходимости компилировать и запускать приложение.

Простые типы данных

Используйте let для создания константы и var для создания переменной. Тип константы указывать не нужно, вы можете присвоить ей значение лишь единожды.

var myVariable = 42 myVariable = 50 let myConstant = 42 

Типы константы и переменной должны совпадать с типами присваиваемых им соответствующих значений. Однако это не означает, что вы должны напрямую указывать их тип. Компилятор автоматически определит тип константы и переменной при присваивании им значения. Так, в приведенном примере компилятор определит, что myVariable имеет целочисленный тип.

Если же инициализатор отсутствует или не предоставляет достаточной информации, вы можете указать тип самостоятельно после переменной, разделив название и тип двоеточием:

let implicitInteger = 70 let inplicitDouble = 70.0 let inplicitDouble: Double = 70 

Давайте поэкспериментируем
Создайте константу с типом Float и проинициализируйте ее числом 4.

Значения никогда не конвертируются в другой тип неявно. Если вам необходимо конвертировать значение в другой тип, делайте это явно:

let label = "The width is " let width = 94 let widthLabel = label + String(width) 

Давайте поэкспериментируем
Попробуйте удалить явное преобразование к типу String в последней строке. Какую ошибку вы получите?

Имеется более простой способ включения значений в строки: для этого заключите выражение в скобки и поставьте перед ними обратный слэш ( \ ). Пример:

let apples = 3 let oranges = 5 let appleSummary = "I have \(apples) apples." let fruitSummary = "I have \(apples + oranges) pieces of fruit." 

Давайте поэкспериментируем
Попробуйте использовать конструкцию \() и выведите на экран строку, включающую результат суммы двух целочисленных переменных и чье-нибудь имя.

При работе с массивами и ассоциативными массивами (словарями, dictionary) используются квадратные скобки ( [] ):

var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water" var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations" 

Чтобы создать пустой массив или dictionary, используйте следующий синтаксис:

let emptyArray = String[]() let emptyDictionary = Dictionary() 

Для создания пустых массивов и словарей используйте [] и [:] соответственно, – например, когда вы присваиваете новое значение переменной или передаете аргумент в функцию.

shoppingList = [] // Went shopping and bought everything. 
Условия и циклы

Для создания условий используются операторы if и switch , для создания циклов – for-in , for , while и do-while . При этом выделять круглыми скобками условия и инициализирующие выражения необязательно, тогда как фигурные скобки обязательны.

let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores < if score >50 < teamScore += 3 >else < teamScore += 1 >> teamScore 

Условие внутри оператора if должно быть логическим, это в частности означает, что выражение if score является ошибочным, поскольку здесь нет явного сравнения (например, с нулем).

Условный оператор if можно использовать совместно с let и var для работы с константами и переменными, которые могут иметь значение nil . Такие константы и переменные называются опциональными (то есть они могут либо принимать какое-либо значение, либо быть равны nil ). Чтобы создать опциональную переменную или константу добавьте знак вопроса ( ? ) после указания типа.

 var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName

Давайте поэкспериментируем
Измените optionalName на nil . Что вы видите на экране? Добавьте блок else для обработки случая, когда optionalName равен nil .

Если опциональное значение равно nil , условие будет ложным и код в фигурных скобках после if выполнен не будет. В противном случае переменной greeting будет присвоено новое значение.

Оператор множественного выбора switch поддерживает внутри себя множество других операторов сравнения и не ограничен лишь простыми сравнениями:

let vegetable = "red pepper" switch vegetable

Давайте поэкспериментируем
Попробуйте удалить условие по умолчанию. Какую ошибку вы получите?

После выполнения подходящего блока кода, программа покидает оператор switch , не проверяя последующие условия. Таким образом вам не нужно вручную добавлять операторы прерывания ( break ) в конце каждого блока case .

Для перебирания элементов ассоциативного массива используйте оператор for-in совместно с указанием пары имен для каждой пары ключ-значение.

let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers < for number in numbers < if number >largest < largest = number >> > largest 

Давайте поэкспериментируем
Добавьте еще одну переменную, которая позволит выяснить, к какому из трех типов относится найденное максимальное число.

Оператор цикла while позволяет выполнять блок кода внутри него до тех пор, пока условие не станет ложным. Условие также может быть указано после блока, который в таком случае будет выполнен по крайней мере один раз.

var n = 2 while n < 100 < n = n * 2 >n var m = 2 do < m = m * 2 >while m < 100 m 

Оператор for можно использовать для перебора последовательности чисел с помощью двух точек ( .. ) или с помощью инициализатора, условия и инкремента. Посмотрите, эти два цикла делают одно и то же:

var firstForLoop = 0 for i in 0..3 < firstForLoop += i >firstForLoop var secondForLoop = 0 for var i = 0; i < 3; ++i < secondForLoop += 1 >secondForLoop 

При создании цикла используйте две точки ( .. ), если не хотите включать большее значение в диапазон, и три точки ( … ), чтобы включить как меньшее, так и большее значения.

Функции и замыкания.

Для объявления функций используйте ключевое слово func . Вызов функции производится через указание ее имени и списка аргументов в круглых скобках. Возвращаемый тип следует отделить от перечня формальных аргументов с помощью -> .

func greet(name: String, day: String) -> String < return "Hello \(name), today is \(day)." >greet("Bob", "Tuesday") 

Давайте поэкспериментируем
Удалите параметр day. Вместо него добавьте переменную, обозначающую наименование подаваемого на обед блюда.

Если функция возвращает множество значений, следует использовать кортеж:

func getGasPrices() -> (Double, Double, Double) < return (3.59, 3.69, 3.79) >getGasPrices() 

Функции также могут иметь неопределенное число аргументов:

func sumOf(numbers: Int. ) -> Int < var sum = 0 for number in numbers < sum += number >return sum > sumOf() sumOf(42, 597, 12) 

Давайте поэкспериментируем
Напишите функцию, позволяющую находить среднее арифметическое произвольного числа своих аргументов.

Функции могут вкладываться друг в друга. Вложенная функция может обращаться к переменным, объявленным во внешней функции. Используйте вложенные функции, чтобы привести в порядок код сложной или большой функции.

func returnFifteen() -> Int < var y = 10 func add() < y += 5 >add() return y > returnFifteen() 

Функции являются объектами первого класса (first-class type), иными словами, функция в качестве свого результата может возвращать другую функцию.

func makeIncrementer() -> (Int -> Int) < func addOne(number: Int) ->Int < return 1 + number >return addOne > var increment = makeIncrementer() increment(7) 

Функция также может принимать другую функцию в качестве одного из аргументов.

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool < for item in list < if condition(item) < return true >> return false > func lessThanTen(number: Int) -> Bool < return number < 10 >var numbers = [20, 19, 7, 12] hasAnyMatches(numbers, lessThanTen) 

Функции являются частным случаем замыканий. Вы можете создать замыкание, не указывая его имени и окружив тело замыкания фигурными скобками ( <> ). Для отделения аргументов и типа возвращаемого значения от тела замыкания используйте оператор in .

numbers.map( < (number: Int) ->Int in let result = 3 * number return result >) 

Давайте поэкспериментируем
Перепишите замыкание таким образом, чтобы оно возвращало ноль для всех лишних чисел.

Существует несколько техник, позволяющих делать замыкания более лаконичными. Если тип замыкания априори известен (например, это callback делегата), можно опустить указание типа его параметров и/или типа возвращаемого значения. Замыкания, состоящие из единственного выражения, неявно возвращают результат этого выражения.

numbers.map(< number in 3 * number >) 

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

sort([1, 5, 3, 12, 2]) < $0 >$1 > 
Объекты и классы

Для создания класса используется зарезервированное слово class . Члены класса объявляются точно так же, как и обычные константы и переменные. Более того, методы класса объявляются как обычные функции.

class Shape < var numberOfSides = 0 func simpleDescription() ->String < return "A shape with \(numberOfSides) sides." >> 

Давайте поэкспериментируем
Добавьте константу-член класса и метод класса, принимающую ее в качестве своего аргумента.

Чтобы создать экземпляр (объект) класса, достаточно добавить круглые скобки после названия класса. Доступ к методам и членам класса осуществляется через точку.

var shape = Shape() shape.numberOfSides = 7 var shapeDescription = shape.simpleDescription() 

В этом примере мы упустили одну важную деталь – конструктор класса, метод init .

class NamedShape < var numberOfSides: Int = 0 var name: String init(name: String) < self.name = name >func simpleDescription() -> String < return "A shape with \(numberOfSides) sides." >> 

Обратите внимание, как член класса name при помощи self отделен от аргумента конструктора name . Аргументы передаются в конструктор обычным образом, как и в любой другой метод класса. Обратите внимание на то, что каждый член класса должен быть проинициализирован – либо при объявлении (как, например, numberOfSides ), либо в конструкторе (как name ).

Деструктор класса – метод deinit , который можно переписать в случае необходимости.

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

Переопределенные дочерним классом методы должны быть помечены ключевым словом override – переопределение методов без override приведет к ошибке. Компилятор также выявляет методы, маркированные override , но не переопределяющие какие-либо методы своего родительского класса.

class Square: NamedShape < var sideLength: Double init(sideLength: Double, name: String) < self.sideLength = sideLength super.init(name: name) numberOfSides = 4 >func area() -> Double < return sideLength * sideLength >override func simpleDescription() -> String < return "A square with sides of length \(sideLength)." >> let test = Square(sideLength: 5.2, name: "my test square") test.area() test.simpleDescription() 

Давайте поэкспериментируем
Создайте класс Circle и наследуйте его от класса NamedShape . Конструктор класса Circle принимает два аргумента – радиус и название. Переопределите методы area и describe этого класса.

Члены класса могут также иметь собственные getter и setter .

class EquilateralTriangle: NamedShape < var sideLength: Double = 0.0 init(sideLength: Double, name: String) < self.sideLength = sideLength super.init(name: name) numberOfSides = 3 >var perimeter: Double < get < return 3.0 * sideLength >set < sideLength = newValue / 3.0 >> override func simpleDescription() -> String < return "An equilateral triagle with sides of length \(sideLength)." >> var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle") triangle.perimeter triangle.perimeter = 9.9 triangle.sideLength 

В setter -е переменной perimeter новое присваиваемое значение неявно называется newValue . Вы можете изменить название этой переменной, указав его в скобках сразу после set .

  1. инициализация членов дочернего класса;
  2. вызов конструктора родительского класса;
  3. изменение значений членов родительского класса.
class TriangleAndSquare < var triangle: EquilateralTriangle < willSet < square.sideLength = newValue.sideLength >> var square: Square < willSet < triangle.sideLength = newValue.sideLength >> init(size: Double, name: String) < square = Square(sideLength: size, name: name) triangle = EquilateralTriangle(sideLength: size, name: name) >> var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape") triangleAndSquare.square.sideLength triangleAndSquare.triangle.sideLength triangleAndSquare.square = Square(sideLength: 50, name: "larger square") triangleAndSquare.triangle.sideLength 

У методов классов имеется одно важное отличие от функций. Названия аргументов функции используются только в пределах этой функции, тогда как в методе класса параметры также используются при вызове этого метода (кроме первого параметра). По умолчанию метод класса имеет одинаковые названия параметров как при вызове, так и внутри себя. Однако вы можете указать другое название (в примере ниже – times ), которое будет использовано только внутри этого метода. При этом для вызова этого метода необходимо использовать первое название ( numberOfTimes ).

class Counter < var count: Int = 0 func incrementBy(amount: Int, numberOfTimes times: Int) < count += amount * times >> var counter = Counter() counter.incrementBy(2, numberOfTimes: 7) 

При работе с опциональными значениями добавьте знак вопроса ( ? ) перед методами, членами класса и т.д. Если значение перед знаком вопроса равно nil , все, что следует после ( ? ) игнорируется и значение всего выражения равно nil . В противном случае выражение вычисляется обычным образом. В обоих случаях результатом всего выражения будет опциональное значение.

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") let sideLength = optionalSquare?.sideLength 
Перечисления и Структуры

Для создания перечислений используется ключевое слово enum . Отметим, что перечисления также могут иметь в своем составе методы.

enum Rank: Int < case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King func simpleDescription() ->String < switch self < case .Ace: return "ace" case .Jack: return "jack" case .Queen: return "queen" case .King: return "king" default: return String(self.toRaw()) >> > let ace = Rank.Ace let aceRawValue = ace.toRaw() 

Давайте поэкспериментируем
Напишите функцию, которая сравнивает 2 перечисления типа Rank по их значениям.

В вышеприведенном примере элементы перечисления первоначально имеют целочисленный тип, и вам достаточно указать значение только первого элемента – значения остальных элементов будут определены в соответствии с порядком их следования. В качестве исходного типа (raw value) значений элементов вы также можете выбрать строковый или вещественные типы.

Для преобразования исходного типа значения в тип перечисления используйте функции toRaw и fromRaw .

if let convertedRank = Rank.fromRaw(3)

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

enum Suit < case Spades, Hearts, Diamonds, Clubs func simpleDescription() ->String < switch self < case .Spades: return "spades" case .Hearts: return "hearts" case .Diamonds: return "diamonds" case .Clubs: return "clubs" >> > let hearts = Suit.Hearts let heartsDescription = hearts.simpleDescription() 

Давайте поэкспериментируем
Добавьте метод Color , возвращающий строку “black” для Spades и Clubs и “red” для Hearts и Diamonds .

Обратите внимание на то, как осуществляется доступ к члену Hearts перечисления Suit . При присваивании значения константе hearts используется полное имя Suit.Hearts , поскольку мы явно не указываем тип этой константы. А в switch мы используем сокращенную форму .Hearts , поскольку тип значения self априори известен. Вы можете использовать сокращенную форму повсеместно, если тип переменной явно указан.

Для создания структур используется ключевое слово struct . Структуры имеют множество схожих черт с классами, включая методы и конструкторы. Одним из наиболее существенных отличий структур от классов является то, что экземпляры структур, в отличие от экземпляров классов, передаются в функции по значению (то есть предварительно создается их локальная копия), тогда как экземпляры классов передаются по ссылке.

struct Card < var rank: Rank var suit: Suit func simpleDescription() ->String < return "The \(rank.simpleDescription()) of \(suit.simpleDescription())" >> let threeOfSpades = Card(rank: .Three, suit: .Spades) let threeOfSpadesDescription = threeOfSpades.simpleDescription() 

Давайте поэкспериментируем
Добавьте в структуру Card метод, который создает полную колоду карт.

Экземпляр члена перечисления может иметь собственные значения и они могут быть разными. Вы присваиваете эти значения при создании экземпляра перечисления (константа success в примере). Связанные и исходные значения это разные вещи: исходное значение члена перечисления всегда постоянно для всех экземпляров перечисления и указывается при его объявлении.

Рассмотрим пример получения с сервера времени восхода и заката Солнца. Сервер отправляет в ответ либо соответствующую информацию, либо сообщение об ошибке.

enum ServerResponse < case Result(String, String) case Error(String) >let success = ServerResponse.Result("6:00 am", "8:09 pm") let failure = ServerResponse.Error("Out of cheese.") switch success

Давайте поэкспериментируем
Добавьте третий вариант в оператор множественного выбора switch

Обратите внимание, каким образом из объекта ServerResponse “вытаскиваются” время восхода и заката.

Протоколы и Расширения.

Для объявления протокола используйте ключевое слово protocol .

protocol ExampleProtocol < var simpleDescription: String < get >mutating func adjust() > 

Протоколы могут поддерживаться классами, перечислениями и структурами.

class SimpleClass: ExampleProtocol < var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() < simpleDescription += " Now 100% adjusted." >> var a = SimpleClass() a.adjust() let aDescription = a.simpleDescription struct SimpleStructure: ExampleProtocol < var simpleDescription: String = "A simple structure" mutating func adjust() < simpleDescription += " (adjusted)" >> var b = SimpleStructure() b.adjust() let bDescription = b.simpleDescription 

Давайте поэкспериментируем
Создайте перечисление, которое будет реализовывать этот протокол.

Обратите внимание на ключевое слово mutating в определении структуры SimpleStructure , которое информирует компилятор о том, что соответствующий метод подвергает структуру изменениям. В противовес этому методы класса SimpleClass не нужно маркировать как mutating , поскольку методы класса всегда могут беспрепятственно его изменять.

Для добавления новых методов или членов класса в уже существующий тип необходимо использовать расширения – extensions . Вы также можете использовать расширения для реализации протокола уже существующим типом, даже если он импортирован из какой-либо библиотеки или фреймворка.

extension Int: ExampleProtocol < var simpleDescription: String < return "The number \(self)" >mutating func adjust() < self += 42 >> 7.simpleDescription 

Давайте поэкспериментируем
Создайте расширение типа Double с переменной-членом absoluteValue .

Вы можете использовать название протокола как и любой другой тип – например, чтобы создать массив объектов разного типа, но реализующих общий протокол. Заметьте, что при работе с объектами такого типа методы, объявленные вне протокола, будут недоступны.

let protocolValue: ExampleProtocol = a protocolValue.simpleDescription // protocolValue.anotherProperty // Uncomment to see the error 

Несмотря на то, что во время выполнения программы переменная protocolValue имеет тип SimpleClass , компилятор считает, что ее тип – ExampleProtocol . Это означает, что вы не сможете случайно получить доступ к методам или членам класса, которые реализуются вне протокола ExampleProtocol .

Обобщенные типы (generics)

Для создания обобщенного типа, заключите имя в угловые скобки ( <> ).

func repeat(item: ItemType, times: Int) -> ItemType[] < var result = ItemType[]() for i in 0..times < result += item >return result > repeat("knock", 4) 

Создавайте обобщенные функции, классы, перечисления и структуры.

// Reimplement the Swift standard library's optional type enum OptionalValue  < case None case Some(T) >var possibleInteger: OptionalValue = .None possibleInteger = .Some(100) 

Если вы хотите задать обобщенные типу определенные требования, такие, как, например, реализация протокола или требование быть наследованным от определенного класса, используйте where .

func anyCommonElements (lhs: T, rhs: U) -> Bool < for lhsItem in lhs < for rhsItem in rhs < if lhsItem == rhsItem < return true >> > return false > anyCommonElements([1, 2, 3], [3]) 

Давайте поэкспериментируем
Измените функцию anyCommonElements таким образом, чтобы она возвращала массив общих элементов.

В простых случаях вы можете опустить where и написать имя протокола или класса после двоеточия. Выражение эквивалентно выражению .

Хотите внедрить подписки в iOS-приложение за 10 минут? Интегрируйте Apphud и:
— оформляйте покупки с помощью лишь одного метода;
— автоматически отслеживайте состояние подписки каждого пользователя;
— легко интегрируйте Subscription Offers;
— отправляйте события о подписках в Amplitude, Mixpanel, Slack и Telegram с учетом локальной валюты пользователя;
— уменьшайте Churn rate в приложениях и возвращайте отписавшихся пользователей.

  • Блог компании Apphud
  • Разработка под iOS
  • Swift

Документация

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

Swift - это фантастический способ писать приложения для телефонов, для десктопных компьютеров, серверов, да и чего-либо еще, что запускает и работает при помощи кода. Swift - безопасный, быстрый и интерактивный язык программирования. Swift вобрал в себя лучшие идеи современных языков с мудростью инженерной культуры Apple. Компилятор оптимизирован для производительности, а язык оптимизирован для разработки, без компромиссов с одной или другой стороны.

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

Swift исключает большой пласт распространенных программных ошибок при помощи применения современных программных паттернов:

  • Переменные всегда инициализированы до того, как будут использованы.
  • Индексы массивов всегда проверяются на out-of-bounds ошибки.
  • Целые числа проверяются на переполнение.
  • Опционалы гарантируют, что значения nil будут явно обработаны.
  • Автоматическое управление памятью
  • Обработка ошибок позволяет осуществлять контролируемое восстановление от непредвиденных ошибок.

Код на Swift скомпилирован и оптимизирован, чтобы получать максимальную отдачу от современного оборудования. Синтаксис и стандартная библиотека спроектированы основываясь на руководстве, что самый очевидный и простой способ написания кода является лучшим вариантом. Комбинация безопасности и скорости делает Swift лучшим кандидатом для написания программ от уровня "Hello, World!" и до целой операционной системы.

Swift совмещает вывод типов и паттерн-матчинг с современным простым синтаксисом, позволяя сложным идеям быть выраженными просто и кратко. И в качестве результата не только становится проще писать код, но и читать его и поддерживать так же становится просто.

Swift уже имеет за плечами годы развития, и он продолжает развиваться, включая в себя все новые и новые возможности. Наши цели на Swift очень амбициозные. Мы с нетерпением ждем, чтобы увидеть что у вас получится создать с его помощью.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Swift: для чего нужен, плюсы и минусы, какие задачи решаем

Swift: для чего нужен, плюсы и минусы, какие задачи решаем

У заказчика уже было приложение на Swift для iOS. Его надо было починить и адаптировать для других платформ. Swift — нативный язык для устройств Apple, у него есть прямой доступ к системным функциям и «железу».

Результаты

6 платформ , на которых работает приложение 250 тысяч установок суммарно За 6 месяцев опубликовали обновленную версию на Свифте

Об инструменте: язык программирования Swift

Swift, или Свифт, — язык программирования, на котором можно разрабатывать приложения для всех платформ Apple. Swift позволяет создавать программы не только для iOS и macOS, но и для tvOS и watchOS.

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

Еще одно преимущество Swift — язык сравнительно простой. Для создания Свифта разработчики Apple заимствовали идеи из разных языков программирования, ориентируясь на простоту написания, чтения и поддержки кода. В результате, обучение программированию на Свифте не занимает много времени. Использование этого языка в разработке позволяет писать приложения с понятным кодом и минимумом ошибок.

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

Для программирования на Свифте используется среда разработки Xcode. Она тоже разработана Apple и позволяет создавать ПО для платформ macOS, iOS, iPadOS, watchOS, tvOS и visionOS. Поэтому для программирования приложений на iOS Swift — оптимальный язык. Мы продолжили разработку приложения клиента на нем.

О проекте: приложение для VPN

Заказчик — канадская платформа с развлекательным контентом, которой пользуются люди со всего мира. Пользователи некоторых стран не могут зайти на платформу из-за блокировок. Заказчик решил обойти проблему — открыть доступ к контенту и защитить персональные данные пользователей. Для этого он хотел сделать платное приложение с VPN

Изначально заказчик нанял для программирования команду, которая предложила самую низкую цену. Она работала над приложением для iOS на Свифте почти год, но получилось так себе. Программа тормозила: время отклика доходило до 15 секунд. В коде было много повторяющихся фрагментов, ошибок в программировании, некорректно работала оплата.

Команде OrbitSoft предстояло:

  1. Исправить ошибки созданного для iOS приложения.
  2. Адаптировать его под разные устройства и ОС.
  3. Починить механизм платной подписки.

Задача осложнялась тем, что приложение для устройств на iOS уже было опубликовано в App Store: пока мы работаем над новой версией, старая должна работать и принимать оплату.

Кому подходит VPN-приложение

  1. Бизнесу с удаленными сотрудниками. С помощью VPN вы защитите конфиденциальные данные от конкурентов.
  2. Сайтам и сервисам. В некоторых странах ограничен доступ к определенному контенту. Если вы работаете в таких условиях, VPN поможет сохранить аудиторию.
  3. Предпринимателям, которые ищут пассивный доход. Приложения для VPN пользуются спросом, и если они удобные, клиенты готовы платить за доступ.

Заказать разработку

Какие задачи решили с помощью Swift

Разработку для iOS мы продолжили на языке Swift: программирование на нативном языке от Apple дает много преимуществ. Оно гарантирует качество и скорость работы приложения на iOS, позволяет задействовать возможности устройства и операционной системы. Рассказываем, какие задачи решили с помощью языка Свифт в проекте.

Переделали дизайн приложения. В старой версии интерфейс на различных устройствах отличался. Например, человек пользуется приложением на смартфоне и планшете на iOS, а выглядит оно по-разному. Или купил новый iPhone, скачал тот же VPN-клиент, а навигация непривычная. Пользователю приходится заново искать нужные функции, ему снова нужно обучение для использования привычного приложения. Это неудобно, пользователи уходили, а компания теряла прибыль. Мы переписали существующий код на Свифте так, чтобы приложение выглядело одинаково на всех устройствах, а клиенты легко в нем ориентировались.

Исправили пользовательскую логику приложения. В старой версии пользователь должен был создать аккаунт до выбора тарифа — то есть сначала ввести личные данные и только потом узнать стоимость услуги. Людям это не нравилось — вместо регистрации в этом приложении они скачивали другие, и компания теряла возможных клиентов.

Мы сделали логику приложения привычной для клиента: сначала выбор тарифа, потом регистрация. Это потребовало изменения серверной части: мы добавили в программу ситуацию, когда человек подписался и закрыл приложение без создания аккаунта. Тогда при следующем входе приложение должно выяснить, оплачена ли подписка у этого незарегистрированного пользователя. Оно делает запрос к серверу и, получив положительный ответ, показывает экран создания аккаунта.

Теперь логика приложения понятна пользователям, данные об оплате всегда сохраняются, а компания не теряет клиентов.

Адаптировали приложение под разные устройства и операционные системы. Мы переписали код приложения на Kotlin для Android и Android TV, на C# — для Windows. Код на Swift почистили от ошибок, заново адаптировали под планшеты. Версию под Mac собирались сделать с помощью Mac Catalyst. Эта технология автоматически переносит на Mac приложения для iOS. Но возникла проблема.

Apple сохраняет пароли в защищенном хранилище Keychain, а доставать их из приложений для iOS через Catalyst не получается. В результате, когда пользователь выбирает сервер VPN, программа вместо подключения требует пароль. Мы искали решение проблемы в сообществе разработчиков. Нашли несколько веток обсуждений на Stack Overflow, но и там ответов не было.

Когда появится решение — неизвестно. Мы решили не ждать, и переписали код на Свифте вручную. Так мы потратили больше ресурсов, но опубликовали версию под Mac без ошибок.

Настроили ежемесячную подписку. В старом приложении были ошибки в механизме подписки. В серверной части, например, данные читались не из тех полей, пользователь некорректно обновлялся в базе. В клиентской части была нарушена логика опроса об истечении срока подписки. Приложение не знало, что оплата закончилась: не напоминало об этом пользователю и само пыталось работать при нулевом балансе. Люди раздражались, что ничего не работает, уходили, а компания теряла деньги.

Мы починили механизм и настроили автоподписку. Теперь приложение продлевает тариф самостоятельно — пользователю не нужно каждый раз вводить платежные данные, а компания может рассчитывать на ежемесячный доход.

Не обошлось и без сложностей. У Apple неудобно организовано тестирование подписки: нужно заводить отдельный аккаунт, на котором тестируемое событие может наступить только 6 раз. Чтобы продолжить, нужен еще один тестовый Apple ID, потом еще и еще — нам в итоге понадобилось около пятидесяти. В официальной документации об этом не упоминается, но мы разобрались и успешно протестировали приложение.

Результаты

  • Первоначальное приложение размещено в App Store в августе 2020. Исправленную версию мы выкатили всего через полгода — в январе 2021. Со всеми доработками и улучшениями проект занял около 10 месяцев.
  • Приложение устанавливается на 6 платформ: iOS, MacOS, Android, Android TV, Fire OS, Windows.
  • Суммарно его установили более 250 000 раз.

Совет OrbitSoft: когда пригодится Swift

Для каких задач Свифт подходит:

  • программирование нагруженных приложений, использующих анимацию, 3D-графику, мультимедиа в высоком качестве. Например, мобильных игр;
  • разработка приложений, которым нужен доступ к специфическим функциям операционной системы или устройства. Например, к камере, Bluetooth, Face или Touch ID, Apple ID;
  • если нужно привлечь более платежеспособную аудиторию. Sensor Tower подсчитал, что в первом полугодии 2020 года пользователи iOS по всему миру потратили 32 миллиарда долларов в приложениях, а пользователи Android — почти в 2 раза меньше.

Для каких проектов стоит выбрать другой инструмент:

  • несложные, малонагруженные приложения быстрее и дешевле писать на кроссплатформенных языках, чем на Свифте ;
  • если интересует широкая аудитория, стоит начать с публикации в Google Play. Согласно Sensor Tower, в первой половине 2020 года из него впервые установили 53 миллиарда приложений, из App Store — почти в 3 раза меньше. При этом для Android приложения на Swift не подойдут, они совместимы только с устройствами Apple .

Готовые продукты и индивидуальная разработка

Системы и платформы:

  • POS + система учета складских остатков
  • Решения для обработки биг‑даты
  • Инструменты для управления рекламой и закупки трафика

Программные продукты:

  • Мобильные приложения
  • Интернет-магазины
  • Видеоплатформы
  • Онлайн-сервисы

Развитие и поддержка:

  • Системное администрирование
  • Разработка высоконагруженных систем на заказ

Консалтинг:

  • Аудит работающих программных решений
  • Консультации: подберем лучшее техническое решение под задачи и расскажем, как его внедрить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *