Документация
Эта документация в основном содержит информацию об API и технологии в разработке. Эта информация может быть изменена и программы, написаные согласно данному руководству должны быть протестированы на корректную работу с последней версией операционной системы.
Swift — это фантастический способ писать приложения для телефонов, для десктопных компьютеров, серверов, да и чего-либо еще, что запускает и работает при помощи кода. Swift — безопасный, быстрый и интерактивный язык программирования. Swift вобрал в себя лучшие идеи современных языков с мудростью инженерной культуры Apple. Компилятор оптимизирован для производительности, а язык оптимизирован для разработки, без компромиссов с одной или другой стороны.
Swift дружелюбен по отношению к новичкам в программировании. Это первый язык программирования промышленного качества, который также понятен и увлекателен, как скриптовый язык. Написание кода в песочнице позволяет экспериментировать с кодом Swift и видеть результат мгновенно, без необходимости компилировать и запускать приложение.
Swift исключает большой пласт распространенных программных ошибок при помощи применения современных программных паттернов:
- Переменные всегда инициализированы до того, как будут использованы.
- Индексы массивов всегда проверяются на out-of-bounds ошибки.
- Целые числа проверяются на переполнение.
- Опционалы гарантируют, что значения nil будут явно обработаны.
- Автоматическое управление памятью
- Обработка ошибок позволяет осуществлять контролируемое восстановление от непредвиденных ошибок.
Код на Swift скомпилирован и оптимизирован, чтобы получать максимальную отдачу от современного оборудования. Синтаксис и стандартная библиотека спроектированы основываясь на руководстве, что самый очевидный и простой способ написания кода является лучшим вариантом. Комбинация безопасности и скорости делает Swift лучшим кандидатом для написания программ от уровня «Hello, World!» и до целой операционной системы.
Swift совмещает вывод типов и паттерн-матчинг с современным простым синтаксисом, позволяя сложным идеям быть выраженными просто и кратко. И в качестве результата не только становится проще писать код, но и читать его и поддерживать так же становится просто.
Swift уже имеет за плечами годы развития, и он продолжает развиваться, включая в себя все новые и новые возможности. Наши цели на Swift очень амбициозные. Мы с нетерпением ждем, чтобы увидеть что у вас получится создать с его помощью.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
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 приложений для портфолио и примете участие в трех хакатонах
Статьи по теме:
- JavaScript
- Заказать пиццу на 300 человек, вернуть стену VK и устроиться на работу
Язык программирования Swift. Русская версия
Привет, Хабр! 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 .
- инициализация членов дочернего класса;
- вызов конструктора родительского класса;
- изменение значений членов родительского класса.
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
Новый язык программирования Swift: комментарии разработчиков
В закладки
Представленный на WWDC 2014 язык программирования Swift стал причиной большой шумихи в кругах разработчиков и породил массу вопросов. Нужно ли обучаться новому языку? Какие его основные преимущества перед Objective-C и C#? И что, собственно, делать тем, кто создает мультиплатформенные игрушки? Для того, чтобы получить ответы на эти вопросы, я обратился к разработчикам известных игр в App Store и подготовил небольшой опрос в формате «разработчик — его приложение — комментарий». Результат получились неоднозначными и где-то даже неожиданным.
Игра Игры Дракона
Язык Swift устраняет проблемы, скопившиеся за 20 лет в языке Objective-C. Он призван, в первую очередь, упростить ситуацию тех разработчиков приложений, которым крайне неудобно работать с громоздкими, сложными конструкциями Objective-C. Язык Swift так же откроет новую эру для начинающих разработчиков, которые теперь помимо разработки маленьких игр на JavaScript, так же смогут выбирать и этот язык. Однако не следует забывать, что в настоящее время Swift не подходит для мультиплатформенных разработок
Игра Blek
Swift — язык интересный и многообещающий, но мы активно используем Unity, так что нам вопрос нового языка программирования комментировать здесь трудно. Мы не собираемся использовать Swift при разработке наших игр.
Игра Demolition Master 3D
На первый взгляд можно сказать, что код на языке Swift будет писаться быстрее, так как отсутствую какие-либо лишние символы. Все очень лаконично, кратко. Также этот язык дает больше гибкости (чего только стоит возврат функцией нескольких значений). Язык являет собой неплохой симбиоз C/C++/Objective C/Java. Трудно пока оценить насколько эта гибкость и лаконичность повлияет на читаемость кода.
В связи отсутствия кросплатформеного компилятора, Swift пока можно использовать только для нативных разработок под iOS и Mac. Пока разработчики игр как и раньше будут отдавать предпочтения Unity 3D, Cocos 2DX, Corona и т.д.
Игра Leo’s Fortune
1) Swift — чистый и современный. Приятно было услышать, что в нем используется LLVM для компиляции нативного кода плюс все Cocoa API адаптированы;
2) Он — более легкий и удобочитаемый, чем Objective-C;
3) Самый большой недостаток таких специфичных платформ, как Objective-C и Swift — вопрос портирования. Мы разрабатываем наши игры в C++, чтобы было легче портировать на другие платформы. Swift улучшить наш Cocoa-код и всё, что касается API компании Apple.
Приложение Clean My Mac
Swift – что-то, что никто не ожидал увидеть на WWDC Keynote. Apple взяла все самое лучшее из всех известных мне языков и воплотила это в Swift. Swift дает большие возможности по упрощению кода. То, что разработчик ранее писал с помощью verbose (слишком многословных) конструкций, сейчас можно заменить несколькими символами. Я не вижу Swift заменой Objective-C. Как выяснилось, он еще немного сырой для полного перевода своих проектов на Swift. Но использовать его можно для задач, которые хочется оптимизировать или визуально упростить. Преимущество для разработчиков игр здесь только одно – если ты видел конструкции, используемые в Swift, в языке, который используешь повседневно – значит все хорошо, переход не займет много времени.
Этот язык создавался в строжайшем секрете с 2010 года. Один из сотрудников Apple в разговоре с Крейгом Федериги сказал, что не ожидал, что от его команды скроют такой продукт. Много разработчиков были растеряны после keynote (Денис присутствовал на WWDC — прим. ред). Но нам всем нужно идти дальше и учиться 🙂
Игра Викторина IRC
С одной стороны, Apple, видимо, делает ставку на привлечение в разработку под свою платформу опытных разработчиков на других языках (в Swift чувствуется влияние многих из них). С другой стороны, в новом Xcode появился также новый режим – REPL (Read-Eval-Print-Loop), который позволяет видеть результат выполнения кода “на лету”, что очень удобно для новичков. Swift вполне может стать их первым языком программирования. Необходимость в создании нового отдельного языка для меня не совсем очевидна, но время покажет, стоило оно того или нет.
Вообще, общее впечатление от API Swift — более простое, чистое, читабельное и понятное. Хоронить Objective-C, наверное, пока рано, но Swift вызвал у всех действительно неподдельный интерес. Единственная возможная причина медленного развития языка — если он так и останется “внутренним”, только для разработки под Apple.
(1 голосов, общий рейтинг: 5.00 из 5)
Хочешь больше? Подпишись на наш Telegram.
В закладки
Представленный на WWDC 2014 язык программирования Swift стал причиной большой шумихи в кругах разработчиков и породил массу вопросов. Нужно ли обучаться новому языку? Какие его основные преимущества перед Objective-C и C#? И что, собственно, делать тем, кто создает мультиплатформенные игрушки? Для того, чтобы получить ответы на эти вопросы, я обратился к разработчикам известных игр в.