Начальная

Windows Commander

Far
WinNavigator
Frigate
Norton Commander
WinNC
Dos Navigator
Servant Salamander
Turbo Browser

Winamp, Skins, Plugins
Необходимые Утилиты
Текстовые редакторы
Юмор

File managers and best utilites

Краткий обзор языка Swift. Самый секретный проект Apple. Реферат swift язык программирования


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

Краткая справка

Swift – это невероятно мощный и простой язык программирования, представленный Apple в 2014 году, благодаря которому для многих программистов открывается возможность создания приложений для iOS, MacOS, Apple TV и Apple Watch. Данный язык унаследовал идеи от Objective-C, Rust, Haskell, Ruby, Python, C# и CLU. Он использует паттерны безопасного программирования и содержит новые функции, что позволяет сделать процесс программирования увлекательным и интересным. Созданный Крисом Латтнером, он вышел надежным, быстрым и открытым языком, благодаря чему стало еще проще создавать приложения для самого популярного телефона в мире.

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

Философия Swift

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

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

Где применяется Swift

Данный язык программирования разработчики используют для написания мобильных приложений для телефонов, умных часов и компьютеров компании Apple. Ходил даже слух, что Google хочет перенести Android полностью на Swift, всякое может быть. Это универсальный язык, который можно использовать в любой платформе от компании из Купертино.

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

Сложность обучения Swift

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

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

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

Плюсы/минусы Swift

У этого современного и мощного языка программирования есть ряд преимуществ, которые выделяют его на фоне других или того же Objective-C. И это новые мощные языковые возможности, предельно строгая типизация данных, более лаконичный синтаксис, существенно более высокая производительность в операциях доступа к коллекциям (сортировка и поиск), поддержка определенного большинства современных синтаксических конструкций, существующих в других высокоуровневых языках программирования. И одной из главных особенностей Swift является то, что он имеет полную обратную совместимость с Objective-C. Таким образом это позволяет постепенно переписывать проекты с одного языка на другой, к тому же дает возможность использовать функционал Objective-C внутри самого Swift.

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

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

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

Сопутствующие технологии

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

Swift более функциональный и доступный язык, который как и Objective-C поддерживает официальные фреймворки Cocoa и Cocoa Touch. В сети доступно множество открытых проектов, в том числе от таких крупных компаний как Airbnb, которые позволяют использовать все современные методы и решения при написании кода.

vadimstroganov.com

Стоит ли изучать Swift? | Библиотека программиста

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

Swift – мощный и интуитивно понятный язык программирования для macOS, iOS, watchOS и tvOS, но отличается от Objective-C более широким набором возможностей, которые ограничивались связью с C. Кроме того, Swift можно назвать безопасным, поскольку язык имеет строгую типизацию: в любой момент времени вы точно знаете, с объектом какого типа вы работаете. Главным его преимуществом является скорость: как в работе над проектом, так и при запуске готового приложения. Именно за это преимущество перед другими языками (по заверениям создателей, он вобрал в себя всё лучшее от других языков программирования) его и назвали Swift (в переводе — быстрый).

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

«изучение Swift»Apple хвастается тем, что Swift до 2.6 раз быстрее, чем Objective-C, и на 8,4 раза быстрее, чем Python 2.7. Думаем, что вопроса почему нужно заботиться о быстром выполнении кода не возникает — и так должно быть понятно, что более быстрый код работает более эффективно и плавно, что позволяет пользователю получилось удовольствие от взаимодействия с устройством.

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

Да!

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

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

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

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

Вероятнее всего, на Ruby или Python. Хотя здесь можно узнать и синтаксис из C.

Cocoa и Cocoa Touch — это фреймворки, которые работают на OS X и iOS соответственно. Оба они в основном реализованы с Objective-C и интегрированы с Xcode (если вы ещё не в курсе, то это среда разработки). Они состоят из библиотек, API-интерфейсов и рантаймов. Поскольку Swift — это язык для разработки под iOS, он также работает с Cocoa и Cocoa Touch. Если интересно, по ссылке более подробная информация со страницы для разработчиков на сайте Apple.

Ну вот, теперь, когда вы знаете кое-что о Swift, вы можете подумать, стоит ли его изучать. Хотя наш совет — начать изучение как можно скорее, для этого помогут наши статьи:

proglib.io

Swift Краткое руководство

Swift является новый язык программирования, разработанный компанией Apple Inc для прошивкой и развития OS X. Swift принимает лучшие C и Objective-C, без ограничений совместимости C.

  • Swift использует безопасные шаблонов программирования.

  • Swift предоставляет современные возможности программирования.

  • Swift обеспечивает Objective-C подобный синтаксис.

  • Swift фантастический способ писать и ОС IOS OS X приложений.

  • Swift обеспечивает беспрепятственный доступ к существующим рамками какао.

  • Swift унифицирует процедурные и объектно-ориентированные части языка.

  • Swift не нужен отдельный импорт библиотеки для поддержки функциональных возможностей, таких как вход / выход или обработки строк.

Swift использует ту же среду выполнения, как существующая система Obj-C на Mac OS и IOS, что позволяет Swift программы для работы на многих существующих IOS 6 и OS X 10.8 платформ.

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

Первый публичный релиз Swift был выпущен в 2010 году занялКрис Lattner почти 14 лет , чтобы придумать с первой официальной версии, а позже, она была поддержана многими другими участниками.Swift был включен в Xcode 6 бета.

Swift дизайнеры взяли идеи из различных других популярных языков, таких как Objective-C, Rust, Haskell, Ruby, Python, C #, и CLU.

Попробуйте электронный вариант

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

Попробуйте следующий пример с помощью нашего онлайн - компилятор доступный в CodingGround

import Cocoa /* My first program in Swift */ var myString = "Hello, World!" println(myString)

Для большинства из примеров, приведенных в данном руководстве, вы найдете попробовать его вариант в наших разделах сайта кода в правом верхнем углу, который доставит вас к онлайн-компилятор. Так что просто использовать его и наслаждаться обучения.

Настройка локального окружения

Swift предоставляет площадка платформу для учебных целей, и мы собираемся установить то же самое. Вам потребуется программное обеспечение Xcode, чтобы начать свой Swift кодирование в Playground. После того, как вы знакомы с понятиями Swift, вы можете использовать Xcode IDE для разработки приложений х / OS Iso.

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

Это будет список вниз ряд программного обеспечения, доступного следующим образом -

Xcode

Теперь выберите Xcode и загрузить его, нажав на данной ссылке рядом с образа диска. После загрузки файла DMG, вы можете установить его простым двойным щелчком по ней и следуя данной инструкции. И, наконец, следовать данной инструкции и поместите значок Xcode в папку приложения.

Xcode

Теперь у вас установлен Xcode на вашей машине. Затем откройте Xcode из папки Application и продолжить после принятия условий. Если все в порядке, вы получите следующий экран -

Детская площадка

ВыберитеНачало работы с опцией детской площадкии введите имя для детской площадки и выберите ОС IOS в качестве платформы. И, наконец, вы получите окно Playground следующим образом -

Детская площадка

Ниже приводится код взят из значения по умолчанию Swift площадка Window.

import UIKit var str = "Hello, playground"

Если вы создаете ту же программу для OS X программы, то она будет включать в себяимпорт какао и программа будет выглядеть следующим образом -

import Cocoa var str = "Hello, playground"

Когда выше программа загружается, он должен отобразить следующий результат в области достижения результатов спортивная площадка (правая сторона).

Hello, playground

Поздравляем, у вас есть Swift среда программирования готова, и вы можете продолжить ваше обучение автомобиль "Учебники Point".

Мы уже видели часть Swift программы при настройке среды. Давайте еще раз начнем со следующегоHello, World программы , созданной для OS X площадка, которая включает в себя импорт какао, как показанониже!-

import Cocoa /* My first program in Swift */ var myString = "Hello, World!" println(myString)

Если вы создаете ту же программу для ОС IOS игровой площадки, то она будет включать в себяимпорт UIKit и программа будет выглядеть следующим образом -

import UIKit var myString = "Hello, World!" println(myString)

Когда мы запускаем эту программу, используя соответствующую игровую площадку, мы получим следующий результат -

Hello, World!

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

Импорт в Swift

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

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

Лексемы в Swift

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

println("test!") The individual tokens are: println ( "test!" )

Комментарии

Комментарии, как помочь тексты в вашей программе Swift. Они игнорируются компилятором. Многоканальный комментарии начинаются с / * и заканчиваться символами * /, как показано ниже -

/* My first program in Swift */

Многострочные комментарии могут быть вложены в Swift. Ниже действительный комментарий в Swift -

/* My first program in Swift is Hello, World! /* Where as second program is Hello, Swift! */

Однострочные комментарии написаны с использованием // в начале комментария.

// My first program in Swift

Точка с запятой

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

Однако, если вы используете несколько операторов в одной строке, то необходимо использовать точку с запятой в качестве разделителя, в противном случае компилятор выдаст ошибку синтаксиса. Вы можете написать выше Hello, World! Программа следующим образом -

import Cocoa /* My first program in Swift */ var myString = "Hello, World!"; println(myString)

Идентификаторы

Срочное идентификатор представляет собой имя, используемое для идентификации переменной, функции или любой другой определенный пользователем элемент. Идентификатор начинается с алфавита от А до Z или от А до Z или подчеркивания _ следуют ноль или более букв, подчеркивания и цифры (от 0 до 9).

Swift не допускает специальные символы, такие как @, $ и% внутри идентификаторов. Swift являетсячувствительно к региструязык программирования. Таким образом,трудовых ресурсовитрудовых ресурсовявляются два различных идентификаторов в Swift. Ниже приведены некоторые примеры допустимых идентификаторов -

Azad zara abc move_name a_123 myname50 _temp j a23b9 retVal

Чтобы использовать зарезервированное слово в качестве идентификатора, то вам нужно поставить ( `обратные одиночные кавычки) до и после него. Например,класс не является допустимым идентификатором, но `class`действителен.

Ключевые слова

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

Ключевые слова, используемые в объявлениях

класс Deinit перечислимый расширение
FUNC Импортировать в этом внутренний
позволять оператор частный протокол
общественности статический структура индекс
typealias вар

Ключевые слова, используемые в отчетности

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

Ключевые слова, используемые в выражениях и типов

в виде dynamicType ложный является
ноль сам собственная личность супер
правда _COLUMN_ _ФАЙЛ_ _FUNCTION_
_ЛИНИЯ_

Ключевые слова, используемые в конкретных контекстах

ассоциативность удобство динамический didSet
окончательный получить инфикс INOUT
ленивый оставил мутирует никто
nonmutating необязательный переопределение постфикс
старшинство префикс протокол обязательный
правильно задавать Тип бесхозный
слабый willSet

Пробелы

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

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

var age

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

int fruit = apples + oranges //get the total fruits

нет пробельные символы не нужны между фруктами и =, или между = и яблок, хотя вы можете включить некоторые для лучшей читаемости.

Литералы

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

92 // Integer literal 4.24159 // Floating-point literal "Hello, World!" // String literal

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

Вы можете, как хранить информацию различных типов данных, таких как строки, характер, широкий символ, целое число, с плавающей точкой, Boolean, и т.д. В зависимости от типа данных переменной, операционная система выделяет память и решает, что может храниться в зарезервированной Память.

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

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

  • Int или UInt - используется для целых чисел.Более конкретно, вы можете использовать Int32, Int64, чтобы определить 32 или 64 битное целое число, в то время как UInt32 или UInt64 определить 32 или 64 бит без знака целочисленных переменных. Например, 42 и -23.

  • Поплавок - используется для представления 32-битное число с плавающей точкой и чисел с меньшими точками.Например, 3,14159, 0,1 и -273.158.

  • Double - используется для представления 64-битное число с плавающей запятой и используется , когда значения с плавающей точкой должны быть очень большими.Например, 3,14159, 0,1 и -273.158.

  • Bool - Это представляет собой логическое значение , которое является истинным или ложным.

  • String - Это упорядоченный набор символов.Например, "Hello, World!"

  • Характер - это односимвольный строка символов.Например, "С"

  • Необязательно - Это представляет собой переменную , которая может содержать либо значение или нет значения.

Мы перечислили здесь несколько важных моментов, связанных с типами Integer -

  • На 32-битной платформе, Int имеет тот же размер, как Int32.

  • На 64-битной платформе, Int имеет тот же размер, как Int64.

  • На 32-битной платформе, UInt имеет тот же размер, как UInt32.

  • На 64-битной платформе, UInt имеет тот же размер, как uint64.

  • INT8, Int16, Int32, Int64 может использоваться для представления 8 бит, 16 бит, 32 бит, и 64-разрядные формы знакового целого числа.

  • Uint8, UInt16, UInt32 и UInt64 могут быть использованы для представления 8 бит, 16 бит, 32 бит и 64 бит формы целого числа без знака.

Bound Значения

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

Тип Типичная разрядность Типичный диапазон
iNT8 1 байт От -127 до 127
uint8 1 байт От 0 до 255
Int32 4 байта -2147483648 До 2147483647
UInt32 4 байта От 0 до 4294967295
Int64 8bytes -9223372036854775808 До 9223372036854775807
UInt64 8bytes От 0 до 18446744073709551615
терка 4 байта 1.2E-38 до 3.4E + 38 (~ 6 цифр)
двойной 8bytes 2.3E-308 до 1.7E + 308 (~ 15 цифр)

Псевдонимы Тип

Вы можете создать новое имя для существующего типа с использованиемtypealias.Вот простой синтаксис для определения нового типа с использованием typealias -

typealias newname = type

Например, следующая строка указывает компилятору , чтоНожки это другое название Int-

typealias Feet = Int

Теперь, следующее объявление совершенно законно и создает целую переменную под названием расстояние -

import Cocoa typealias Feet = Int var distance: Feet = 100 println(distance)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

100

Тип безопасности

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

Как Свифт типобезопасного, он выполняет проверок типа при компиляции кода и флаги любые несогласованные типы, как ошибки.

import Cocoa var varA = 42 varA = "This is hello" println(varA)

Когда мы собираем эту программу, она производит следующую ошибку компиляции времени.

Playground execution failed: error: <EXPR>:6:6: error: cannot assign to 'let' value 'varA' varA = "This is hello"

Тип Умозаключение

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

import Cocoa // varA is inferred to be of type Int var varA = 42 println(varA) // varB is inferred to be of type Double var varB = 3.14159 println(varB) // varC is also inferred to be of type Double var varC = 3 + 0.14159 println(varC)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

42 3.14159 3.14159

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

Swift поддерживает следующие основные типы переменных -

  • Int или UInt - используется для целых чисел.Более конкретно, вы можете использовать Int32, Int64, чтобы определить 32 или 64 битное целое число, в то время как UInt32 или UInt64 определить 32 или 64 бит без знака целочисленных переменных. Например, 42 и -23.

  • Поплавок - используется для представления 32-битное число с плавающей точкой.Он используется для хранения чисел с меньшими точками. Например, 3,14159, 0,1 и -273.158.

  • Double - используется для представления 64-битное число с плавающей запятой и используется , когда значения с плавающей точкой должны быть очень большими.Например 3,14159, 0,1, и -273,158.

  • Bool - Это представляет собой логическое значение , которое является истинным или ложным.

  • String - Это упорядоченный набор символов.Например, "Hello, World!"

  • Характер - это односимвольный строка символов.Например, "С"

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

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

Объявление переменных

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

var variableName = <initial value>

В следующем примере показано, как объявить переменную в Swift -

import Cocoa var varA = 42 println(varA)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

42

Тип Аннотации

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

var variableName:<data type> = <optional initial value>

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

import Cocoa var varA = 42 println(varA) var varB:Float varB = 3.14159 println(varB)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

42 3.1415901184082

Присвоение имен переменных

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

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

import Cocoa var _var = "Hello, Swift!" println(_var) var 你好 = "你好世界" println(你好)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Hello, Swift! 你好世界

Печать переменных

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

import Cocoa var varA = "Godzilla" var varB = 1000.00 println("Value of \(varA) is more than \(varB) millions")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Value of Godzilla is more than 1000.0 millions

Swift также вводит типOPTIONALS, который обрабатывает отсутствие значения.Optionals говорят либо "есть значение, и он равен х" или "нет значения на всех".

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

Вот необязательный целочисленный декларация -

var perhapsInt: Int?

Вот дополнительная декларация String -

var perhapsStr: String?

Вышеуказанное заявление эквивалентно явно инициализации невсухую , что означает никакого значения -

var perhapsStr: String? = nil

Давайте рассмотрим следующий пример, чтобы понять, как работать в OPTIONALS Swift -

import Cocoa var myString:String? = nil if myString != nil { println(myString) }else { println("myString has nil value") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

myString has nil value

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

Принудительный Unwrapping

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

Давайте возьмем простой пример -

import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { println(myString) }else { println("myString has nil value") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Optional("Hello, Swift!")

Теперь давайте применим разворачивать, чтобы получить правильное значение переменной -

import Cocoa var myString:String? myString = "Hello, Swift!" if myString != nil { println( myString! ) }else { println("myString has nil value") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Hello, Swift!

Автоматическое Unwrapping

Вы можете объявить дополнительные переменные, используя восклицательный знак вместо знака вопроса. Такие необязательные переменные будут разворачивать автоматически и вам не нужно использовать какие-либо дальнейшие восклицательный знак в конце переменной, чтобы получить назначенное значение. Давайте возьмем простой пример -

import Cocoa var myString:String! myString = "Hello, Swift!" if myString != nil { println(myString) }else { println("myString has nil value") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Hello, Swift!

Необязательный Binding

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

Необязательный для связывания,если заявление выглядит следующим образом -

if let constantName = someOptional { statements }

Давайте возьмем простой пример, чтобы понять использование необязательно связывания -

import Cocoa var myString:String? myString = "Hello, Swift!" if let yourString = myString { println("Your string has - \(yourString)") }else { println("Your string does not have a value") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Your string has - Hello, Swift!

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

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

Константы декларация

Перед тем, как использовать константы, вы должны объявить их , используя ключевое словопусть следующим образом -

let constantName = <initial value>

Ниже приведен простой пример, чтобы показать, как объявить константу в Swift -

import Cocoa let constA = 42 println(constA)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

42

Тип Аннотации

Вы можете предоставитьаннотацию типа при объявлении константы, чтобы иметь четкое представление о виде значений константы может хранить.Ниже приведен синтаксис -

var constantName:<data type> = <optional initial value>

В следующем примере показано, как объявить константу в Свифт с помощью аннотаций. При этом важно отметить, что он является обязательным, чтобы обеспечить начальное значение при создании постоянной -

import Cocoa let constA = 42 println(constA) let constB:Float = 3.14159 println(constB)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

42 3.1415901184082

Присвоение имен константы

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

Вы можете использовать простые или Unicode символы, чтобы присвоить имена переменных. Ниже приведены примеры действительных -

import Cocoa let _const = "Hello, Swift!" println(_const) let 你好 = "你好世界" println(你好)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Hello, Swift! 你好世界

Печать Константы

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

import Cocoa let constA = "Godzilla" let constB = 1000.00 println("Value of \(constA) is more than \(constB) millions")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Value of Godzilla is more than 1000.0 millions

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

42 // Integer literal 3.14159 // Floating-point literal "Hello, world!" // String literal

Целые литералы

Целочисленный литерал может быть десятичным, двоичной, восьмеричной, или шестнадцатеричная константа. Двоичные литералы начинаются с 0b, восьмеричные литералы начинаются с 0o, и шестнадцатеричные литералы начинаются с 0x и ничего для десятичной.

Вот некоторые примеры целочисленных литералов -

let decimalInteger = 17 // 17 in decimal notation let binaryInteger = 0b10001 // 17 in binary notation let octalInteger = 0o21 // 17 in octal notation let hexadecimalInteger = 0x11 // 17 in hexadecimal notation

С плавающей точкой Литералы

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

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

Шестнадцатиричные с плавающей точкой литералы состоят из 0x префикса, за которым может следовать шестнадцатеричном фракции, с последующим шестнадцатеричным показателем.

Вот некоторые примеры операций с плавающей запятой литералов -

let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0

Строковые литералы

Строковый литерал представляет собой последовательность символов в двойные кавычки, с помощью следующей формы -

"characters"

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

последовательность побег Имея в виду
\ 0 Нулевой символ
\\ \персонаж
\ б возврат на одну позицию
\ е Прогон
\ п Новая линия
Возврат каретки
\ т Горизонтальная табуляция
\ v Вертикальная вкладка
\ ' Single Цитата
\ " Дважды Цитировать
\ 000 Восьмеричное число от одного до трех цифр
\ Xhh ... Шестнадцатеричное число из одной или более цифр

В следующем примере показано, как использовать несколько строковых литералов -

import Cocoa let stringL = "Hello\tWorld\n\nHello\'Swift\'" println(stringL)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Hello World Hello'Swift'

булевы литералы

Есть три Булевы литералы и они являются частью стандартных Swift ключевых слов -

  • Значениеистинно представляющее истинно.
  • Значениеложно представляя ложные.
  • Значениеноль не представляющих никакой ценности.

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

  • Арифметические операторы
  • Операторы сравнения
  • Логические операторы
  • Битовые операторы
  • Операторы присваивания
  • Диапазон Операторы
  • Разное Операторы

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

Арифметические операторы

В следующей таблице представлены все арифметические операции, поддерживаемые Swift языком. Предположим , переменнаяА имеет 10 и переменная Bимеет 20, а затем -

Показать примеры

оператор Описание пример
И плюс; Добавляет два операнда Плюс; B даст 30
- Вычитает второй операнд из первого A - B даст -10
* Умножение оба операнда A * B даст 200
/ Деление числителя знаменателя B / A даст 2
% Modulus Оператор и остальная часть после / флоат деления целого числа B% A даст 0
++ Приращение оператор увеличивает целое значение на единицу A ++ даст 11
- Оператор декремент целое значение на единицу A-- даст 9

Операторы сравнения

В следующей таблице приведены все операторы сравнения, поддерживаемые Swift языком. Предположим , переменнаяА имеет 10 и переменная Bимеет 20, а затем -

Показать примеры

оператор Описание пример
== Проверяет, является ли значения двух операндов равны или нет; если да, то условие становится истинным. (A == B) не является истинным.
знак равно Проверяет, является ли значения двух операндов равны или нет; если значения не равны, то условие становится истинным. (A! = B) истинно.
> Проверяет, является ли значение левого операнда больше значения правого операнда; если да, то условие становится истинным. (A> B) не соответствует действительности.
< Проверяет, является ли значение левого операнда меньше значения правого операнда; если да, то условие становится истинным. (A <B) истинно.
> = Проверки, если значение левого операнда больше или равно значению правого операнда; если да, то условие становится истинным. (A> = B) не соответствует действительности.
<= Проверки, если значение левого операнда меньше или равно значению правого операнда; если да, то условие становится истинным. (A <= B) является истинным.

Логические операторы

В следующей таблице приведены все логические операторы, поддерживаемые Swift язык. Предположим , переменнаяА имеет место 1 и переменная Bимеет 0, а затем -

Показать примеры

оператор Описание пример
&& Вызывается логический оператор. Если оба операнда отличны от нуля, то условие становится истинным. (A && B) является ложным.
|| Вызывается логический оператор ИЛИ. Если какой-либо из двух операндов не равен нулю, то условие становится истинным. (A || B) истинно.
! Вызывается Логический оператор NOT. Используйте, чтобы полностью изменяет логическое состояние операнда. Если условие истинно, то логический оператор НЕ будет делать это ложь. ! (A && B) истинно.

Битовые операторы

Битовые операторы работают над битами и выполнять по крупицам операции. Таблицы истинности для &, |, и ^ следующим образом -

п Q р & д р | Q р ^ д
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Assume if A = 60; and B = 13; now in binary format they will be as follows: A = 0011 1100 B = 0000 1101 ----------------- A & B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011

Битовые операторы поддерживаются Swift языка, перечислены в следующей таблице. Предположим , переменнаяА имеет 60 и переменная Bимеет 13, а затем -

Показать примеры

оператор Описание пример
& Двоичного кода и оператора копирует бит результата, если он существует в обоих операндах. (A & B) даст 12, 0000 1100
| Бинарные или оператор копирует бит, если он существует в любом операнде. (A | B) даст 61, который является 0011 1101
^ Бинарные копии XOR оператора бит, если он установлен в одном операнде, но не оба. (А ^ В) даст 49, который 0011 0001
~ Бинарным комплемента Оператор унарна и имеет эффект битов "листать". (~ А) даст -61, который 1100 0011 в форме дополнения 2'S.
<< Binary Оператор сдвига влево. Значение левый операнды перемещается влево на число битов, заданное правым операндом. A << 2 даст 240, который 1111 0000
>> Binary Оператор сдвига вправо. Значение левый операнды перемещается вправо на число битов, заданное правым операндом. A >> 2 даст 15, который является 0000 1111

Операторы присваивания

Swift поддерживает следующие операторы присваивания -

Показать примеры

оператор Описание пример
знак равно Простой оператор присваивания, присваивает значения с правой стороны к операндам левой стороне операнда C = A + B присвоит значение A + B в C
+ = Добавление и оператор присваивания, Он добавляет правый операнд к левому операнда и присваивает результат левого операнда С + = А эквивалентно C = C + A
знак равно Вычтите И оператор присваивания, вычитает правого операнда из левого операнда и присваивает результат левого операнда С - = А эквивалентно С = С -
знак равно Умножать и оператор присваивания, Он умножает правый операнд с левого операнда и присваивает результат левого операнда С * = А эквивалентно C = C * A
знак равно Разделяй и оператор присваивания, Он делит левый операнд с правого операнда и присваивает результат левого операнда С / = А эквивалентно C = C / A
знак равно Modulus и назначение оператора, он принимает модуль с помощью двух операндов и присваивает результат левого операнда С% = А эквивалентно C = C% A
<< = Сдвиг влево и оператор присваивания C << = 2 такое же, как C = C << 2
>> = Сдвиг вправо и оператор присваивания C >> = 2 такой же, как C = C >> 2
знак равно Побитовое И оператор присваивания С & = 2 является такой же, как C = C & 2
^ = побитовое исключающее ИЛИ и оператор присваивания С ^ = 2 является такой же, как С = С ^ 2
| = поразрядное ИЛИ и оператор присваивания С | = 2 такое же, как C = C | 2

Диапазон Операторы

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

Показать примеры

оператор Описание пример
Закрытый Диапазон (А ... б) определяет диапазон, который работает от а до Ь, и включает в себя значения а и Ь. 1 ... 5 дает 1, 2, 3, 4 и 5
Half-Open Range (А .. <б) определяет диапазон, который работает от А до Б, но не включает б. 1 .. <5 дает 1, 2, 3, и 4

Разное Операторы

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

Показать примеры

оператор Описание пример
унарный минус Знак числового значения может быть переключена с помощью Префиксальный - -3 Или -4
Унарное Plus Возвращает значение, которое действует на, без каких-либо изменений. +6 Дает 6
тернарный условный Состояние ? X: Y Если условие верно? Тогда значение X: В противном случае значение Y.

Операторы Внеочередные

Приоритет операторов определяет группировку терминов в выражении. Это влияет, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.

Например, х = 7 + 3 * 2; Здесь, х присваивается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала получает умножается на 3 * 2, а затем добавляет в 7.

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

Показать пример

Тип оператора оператор Ассоциативность
Первичное выражение Операторы () []. выраж ++ expr-- слева направо
унарными

* & + -! ~ ++ Выраж --expr

* /%

+ -

>> <<

<> <=> =

==! =

справа налево
Бинарные операторы

&

^

|

&&

||

слева направо
тернарный оператор ?: справа налево
Операторы присваивания = + = - = * = / =% = >> = << = & = ^ = | = справа налево
запятая , слева направо

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

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

Принимать решение

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

Sr.No Заявление & Описание
1 если заявление

,Если заявление состоит из логического выражения следует один или более операторов.

2 если другое заявление ...

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

3 если ... то еще , если ... Else

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

4 вложенные если заявления

Можно использовать один или иначе, если, если заявление внутри другого, если или иначе, если заявление (ы).

5 переключатель заявление

Операторпереключатель позволяет переменной быть проверены на равенство в отношении списка значений.

? : Оператор

Мы покрылиусловный оператор: в предыдущей главе , которая может быть использована для замены IF ... ELSEзаявления. Он имеет следующий общий вид -

Exp1 ? Exp2 : Exp3;

Где EXP1, exp2 и exp3 являются выражениями. Обратите внимание на использование и размещение в толстой кишке.

? Значение а выражение определяется следующим образом : EXP1 оценивается.Если это правда, то exp2 вычисляется и становится значениемвсего? Экспрессии.Если EXP1 ложно, то exp3 вычисляется и его значение становится значением выражения.

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

Языки программирования обеспечивают различные управляющие структуры, позволяющие более сложных путей выполнения.

Оператор цикла позволяет выполнить оператор или группа операторов несколько раз. Ниже приводится общее от из оператора цикла в большинстве языков программирования -

Петля Архитектура

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

Sr.No Тип Loop & Описание
1 для в

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

2 цикл

Выполняет последовательность операторов несколько раз и сокращает код, который управляет переменную цикла.

3 в то время как цикл

Повторяется заявление или группу операторов, пока заданное условие истинно. Он проверяет условие перед выполнением тела цикла.

4 делать ... в то время как цикл

Как в то время как заявление, за исключением того, что он проверяет условие в конце тела цикла.

Операторы управления Loop

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

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

S.No Заявление Control & Описание
1 продолжить заявление

Это утверждение говорит цикл, чтобы остановить то, что он делает, и начать снова в начале следующей итерации цикла.

2 заявление перерыва

Завершает операторцикла и передает выполнение заявление сразу после цикла.

3 проваливаемся заявление

Проваливаемся заявление имитирует поведение быстрого коммутатора к коммутатору C-стиле.

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

Создание строки

Вы можете создать строку либо с помощью строкового литерала или создания экземпляра класса Струнный следующим образом -

import Cocoa // String creation using String literal var stringA = "Hello, Swift!" println( stringA ) // String creation using String instance var stringB = String("Hello, Swift!") println( stringB )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Hello, Swift! Hello, Swift!

Пустая строка

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

import Cocoa // Empty string creation using String literal var stringA = "" if stringA.isEmpty { println( "stringA is empty" ) }else { println( "stringA is not empty" ) } // Empty string creation using String instance let stringB = String() if stringB.isEmpty { println( "stringB is empty" ) }else { println( "stringB is not empty" ) }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

stringA is empty stringB is empty

Константы строк

Можно указать , можно ли изменять ваш String (или мутантный), присваивая его переменной, или она будет постоянной, назначив ее постоянной с помощью ключевого слова неговоря , как показано ниже -

import Cocoa // stringA can be modified var stringA = "Hello, Swift!" stringA + = "--Readers--" println( stringA ) // stringB can not be modified let stringB = String("Hello, Swift!") stringB + = "--Readers--" println( stringB )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Playground execution failed: error: <EXPR>:10:1: error: 'String' is not convertible to '@lvalue UInt8' stringB + = "--Readers--"

Строка Интерполяция

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

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

import Cocoa var varA = 20 let constA = 100 var varC:Float = 20.0 var stringA = "\(varA) times \(constA) is equal to \(varC * 100)" println( stringA )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

20 times 100 is equal to 2000.0

Строка Concatenation

Вы можете использовать оператор + для конкатенации двух строк или строки и символ, или два символа. Вот простой пример -

import Cocoa let constA = "Hello," let constB = "World!" var stringA = constA + constB println( stringA )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Hello,World!

Длина строки

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

import Cocoa var varA = "Hello, Swift!" println( "\(varA), length is \(count(varA))" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Hello, Swift!, length is 13

Строка сравнения

Вы можете использовать оператор == для сравнения двух строк переменных или констант. Вот простой пример -

import Cocoa var varA = "Hello, Swift!" var varB = "Hello, World!" if varA == varB { println( "\(varA) and \(varB) are equal" ) }else { println( "\(varA) and \(varB) are not equal" ) }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Hello, Swift! and Hello, World! are not equal

Unicode строк

Вы можете получить доступ к UTF-8 и UTF-16 представление строки перебирает его utf8 и utf16 свойств, как показано в следующем примере -

import Cocoa var unicodeString = "Dog" println("UTF-8 Codes: ") for code in unicodeString.utf8 { print("\(code) ") } print("\n") println("UTF-16 Codes: ") for code in unicodeString.utf16 { print("\(code) ") }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

UTF-8 Codes: 68 111 103 226 128 188 240 159 144 182 UTF-16 Codes: 68 111 103 8252 55357 56374

Функции обработки строк и операторы

Swift поддерживает широкий спектр методов и операторов, связанных с струнных инструментов -

S.No Функции / Операторы и назначения
1

пусто

Логическое значение, которое определяет, является ли строка пустой или нет.

2

hasPrefix (префикс: String)

Функция, чтобы проверить, существует ли данная строка параметра в качестве префикса строки или нет.

3

hasSuffix (суффикс: String)

Функция, чтобы проверить, существует ли данная строка параметра в качестве префикса строки или нет.

4

toInt ()

Функция для преобразования числового значения типа String в Integer.

5

кол - ()

Глобальная функция подсчета количества символов в строке.

6

utf8

Свойство вернуть представлениеUTF-8 строки.

7

utf16

Свойство вернутьUTF-16 представление строки.

8

unicodeScalars

Свойство вернуть представлениеUnicode скалярной строки.

9

+

Оператор соединить две строки, или строку и символ, или два символа.

10

+ =

Оператор, чтобы добавить строку или символ существующей строки.

11

==

Оператор для определения равенства двух строк.

12

<

Оператор для выполнения лексикографическое сравнение, чтобы определить, является ли результатом вычисления одной строки, как меньше, чем другой.

13

==

Оператор для определения равенства двух строк.

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

import Cocoa let char1: Character = "A" let char2: Character = "B" println("Value of char1 \(char1)") println("Value of char2 \(char2)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of char1 A Value of char2 B

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

import Cocoa // Following is wrong in Swift let char: Character = "AB" println("Value of char \(char)")

Пустые символьные переменные

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

import Cocoa // Following is wrong in Swift let char1: Character = "" var char2: Character = "" println("Value of char1 \(char1)") println("Value of char2 \(char2)")

Доступ символов из строк

Как объяснялось при обсуждении строк Свифта, String представляет собой набор значений символов в определенном порядке. Таким образом , мы можем получить доступ к отдельным символам из заданной строки перебирает этой строки сдля-в цикле -

import Cocoa for ch in "Hello" { println(ch) }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

H e l l o

Конкатенация строк с помощью символов

Следующий пример демонстрирует, как персонаж быстротекущей может быть сцеплены с Последовательностью Свифта.

import Cocoa var varA:String = "Hello " let varB:Character = "G" varA.append( varB ) println("Value of varC = \(varA)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of varC Hello G

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

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

Создание массивов

Вы можете создать пустой массив определенного типа, используя следующий синтаксис инициализатора -

var someArray = [SomeType]()

Ниже приведен синтаксис для создания массива заданного размера а * и инициализировать его со значением -

var someArray = [SomeType](count: NumbeOfElements, repeatedValue: InitialValue)

Вы можете использовать следующую инструкцию , чтобы создать пустой массив типаInt , имеющего 3 элемента и начальное значение как ноль -

var someInts = [Int](count: 3, repeatedValue: 0)

Ниже приводится еще один пример, чтобы создать массив из трех элементов и присвоить три значения для этого массива -

var someInts:[Int] = [10, 20, 30]

Доступ к Массивам

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

var someVar = someArray[index]

Здесьиндекс начинается с 0 , что означает первый элемент можно получить с помощью индекса как 0, второй элемент можно получить , используя индекс как 1 и так далее.В следующем примере показано, как создать, инициализировать и массивы доступа -

import Cocoa var someInts = [Int](count: 3, repeatedValue: 10) var someVar = someInts[0] println( "Value of first element is \(someVar)" ) println( "Value of second element is \(someInts[1])" ) println( "Value of third element is \(someInts[2])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of first element is 10 Value of second element is 10 Value of third element is 10

Модификация Массивы

Вы можете использоватьAppend () оператор метода или добавление присваивания (+ =) , чтобы добавить новый элемент в конец массива.Взгляните на следующий пример. Здесь, на начальном этапе, мы создаем пустой массив, а затем добавить новые элементы в том же массиве -

import Cocoa var someInts = [Int]() someInts.append(20) someInts.append(30) someInts += [40] var someVar = someInts[0] println( "Value of first element is \(someVar)" ) println( "Value of second element is \(someInts[1])" ) println( "Value of third element is \(someInts[2])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of first element is 20 Value of second element is 30 Value of third element is 40

Вы можете изменить существующий элемент массива, присвоив новое значение по указанному индексу, как показано в следующем примере -

import Cocoa var someInts = [Int]() someInts.append(20) someInts.append(30) someInts += [40] // Modify last element someInts[2] = 50 var someVar = someInts[0] println( "Value of first element is \(someVar)" ) println( "Value of second element is \(someInts[1])" ) println( "Value of third element is \(someInts[2])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of first element is 20 Value of second element is 30 Value of third element is 50

Перебор массива

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

import Cocoa var someStrs = [String]() someStrs.append("Apple") someStrs.append("Amazon") someStrs += ["Google"] for item in someStrs { println(item) }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Apple Amazon Google

Вы можете использоватьПеречислим () функцию , которая возвращает индекс элемента вместе с его значением , как показано ниже в следующем примере -

import Cocoa var someStrs = [String]() someStrs.append("Apple") someStrs.append("Amazon") someStrs += ["Google"] for (index, item) in enumerate(someStrs) { println("Value at index = \(index) is \(item)") }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value at index = 0 is Apple Value at index = 1 is Amazon Value at index = 2 is Google

Добавление двух массивов

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

import Cocoa var intsA = [Int](count:2, repeatedValue: 2) var intsB = [Int](count:3, repeatedValue: 1) var intsC = intsA + intsB for item in intsC { println(item) }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

2 2 1 1 1

Количество недвижимости

Вы можете использовать свойство только для чтениякол - массива , чтобы узнать количество элементов в массиве , показанный ниже -

import Cocoa var intsA = [Int](count:2, repeatedValue: 2) var intsB = [Int](count:3, repeatedValue: 1) var intsC = intsA + intsB println("Total items in intsA = \(intsA.count)") println("Total items in intsB = \(intsB.count)") println("Total items in intsC = \(intsC.count)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Total items in intsA = 2 Total items in intsB = 3 Total items in intsC = 5

Пустой недвижимости

Вы можете использовать только для чтения свойствопустого массива , чтобы выяснить , является ли массив пуст или нет , как показано ниже -

import Cocoa var intsA = [Int](count:2, repeatedValue: 2) var intsB = [Int](count:3, repeatedValue: 1) var intsC = [Int]() println("intsA.isEmpty = \(intsA.isEmpty)") println("intsB.isEmpty = \(intsB.isEmpty)") println("intsC.isEmpty = \(intsC.isEmpty)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

intsA.isEmpty = false intsB.isEmpty = false intsC.isEmpty = true

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

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

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

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

Создание словарь

Вы можете создать пустой словарь определенного типа, используя следующий синтаксис инициализатора -

var someDict = [KeyType: ValueType]()

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

var someDict = [Int: String]()

Ниже приведен пример для создания словаря из набора заданных значений -

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]

Доступ Словари

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

var someVar = someDict[key]

Давайте проверим следующий пример для создания, инициализации, и значения доступа из словаря -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var someVar = someDict[1] println( "Value of key = 1 is \(someVar)" ) println( "Value of key = 2 is \(someDict[2])" ) println( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of key = 1 is Optional("One") Value of key = 2 is Optional("Two") Value of key = 3 is Optional("Three")

Изменение словарей

Вы можете использоватьupdateValue (forKey :) метод , чтобы добавить существующее значение для данного ключа словаря.Этот метод возвращает необязательный значение типа значения в словаря. Вот простой пример -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var oldVal = someDict.updateValue("New value of one", forKey: 1) var someVar = someDict[1] println( "Old value of key = 1 is \(oldVal)" ) println( "Value of key = 1 is \(someVar)" ) println( "Value of key = 2 is \(someDict[2])" ) println( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Old value of key = 1 is Optional("One") Value of key = 1 is Optional("New value of one") Value of key = 2 is Optional("Two") Value of key = 3 is Optional("Three")

Можно изменить существующий элемент словаря путем присвоения нового значения в заданном ключе, как это показано в следующем примере -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var oldVal = someDict[1] someDict[1] = "New value of one" var someVar = someDict[1] println( "Old value of key = 1 is \(oldVal)" ) println( "Value of key = 1 is \(someVar)" ) println( "Value of key = 2 is \(someDict[2])" ) println( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Old value of key = 1 is Optional("One") Value of key = 1 is Optional("New value of one") Value of key = 2 is Optional("Two") Value of key = 3 is Optional("Three")

Удалить пар ключ-значение

Вы можете использовать методremoveValueForKey () , чтобы удалить пару ключ-значение из словаря.Этот метод удаляет пару ключ-значение, если она существует, и возвращает удаленное значение, или возвращает NIL, если не существует никакого значения. Вот простой пример -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var removedValue = someDict.removeValueForKey(2) println( "Value of key = 1 is \(someDict[1])" ) println( "Value of key = 2 is \(someDict[2])" ) println( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of key = 1 is Optional("One") Value of key = 2 is nil Value of key = 3 is Optional("Three")

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

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] someDict[2] = nil println( "Value of key = 1 is \(someDict[1])" ) println( "Value of key = 2 is \(someDict[2])" ) println( "Value of key = 3 is \(someDict[3])" )

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Value of key = 1 is Optional("One") Value of key = 2 is nil Value of key = 3 is Optional("Three")

Перебор словарь

Вы можете использоватьдля - вцикле перебрать весь набор пар ключ-значение в словаре , как показано в следующем примере -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] for (key, value) in someDict { println("Dictionary key \(key) - Dictionary value \(value)") }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Dictionary key 2 - Dictionary value Two Dictionary key 3 - Dictionary value Three Dictionary key 1 - Dictionary value One

Вы можете использоватьПеречислим () функцию , которая возвращает индекс элемента вместе с его (ключ, значение) пара , как показано ниже в примере -

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] for (key, value) in enumerate(someDict) { println("Dictionary key \(key) - Dictionary value \(value)") }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Dictionary key 0 - Dictionary value (2, Two) Dictionary key 1 - Dictionary value (3, Three) Dictionary key 2 - Dictionary value (1, One)

Преобразовать в Массивы

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

import Cocoa var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] let dictKeys = [Int](someDict.keys) let dictValues = [String](someDict.values) println("Print Dictionary Keys") for (key) in dictKeys { println("\(key)") } println("Print Dictionary Values") for (value) in dictValues { println("\(value)") }

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Print Dictionary Keys 2 3 1 Print Dictionary Values Two Three One

Количество недвижимости

Вы можете использовать свойство словаря для чтения толькорассчитывать , чтобы узнать количество элементов в словаре , как показано ниже -

import Cocoa var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var someDict2:[Int:String] = [4:"Four", 5:"Five"] println("Total items in someDict1 = \(someDict1.count)") println("Total items in someDict2 = \(someDict2.count)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

Total items in someDict1 = 3 Total items in someDict2 = 2

Пустой недвижимости

Вы можете использовать только для чтенияпустое свойство словаря , чтобы выяснить , является ли пуста или не словарь, как показано ниже -

import Cocoa var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"] var someDict2:[Int:String] = [4:"Four", 5:"Five"] var someDict3:[Int:String] = [Int:String]() println("someDict1 = \(someDict1.isEmpty)") println("someDict2 = \(someDict2.isEmpty)") println("someDict3 = \(someDict3.isEmpty)")

Когда приведенный выше код компилируется и выполняется, он производит следующий результат -

someDict1 = false someDict2 = false someDict3 = true

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

  • Функция Декларация - Это говорит компилятору об имени функции во, тип возвращаемого значения и параметров.

  • Функция Определение - Она обеспечивает фактическое тело функции.

Swift функции содержат тип параметра и его типы возвращения.

Функция Определение

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

Каждая функция имеет имя функции, которая описывает задачу, которая выполняет функцию. Чтобы использовать функцию, вы "вызов" эту функцию с именем и передать входные значения (известные как аргументы), которые соответствуют типы параметров функции. Параметры функции также называют "кортежей".

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

Синтаксис

func funcname(Parameters) -> returntype { Statement1 Statement2 --- Statement N return parameters }

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

func student(name: String) -> String { return name } println(student("First Program")) println(student("About Functions"))

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

First Program About Functions

Вызов функции

Давайте предположим, что мы определили функцию под названием "дисплей", чтобы рассмотреть, например, для отображения номера функции с именем функции '' дисплей инициализируется первым с аргументом '' no1 который содержит целый тип данных. Тогда аргумент 'нет1' присваивается аргумент 'а', который в дальнейшем будет указывать на тот же тип данных целого числа. Теперь аргумент "а" возвращается к функции. Здесь функция отображения () будет содержать целое значение и возвращает целые значения, когда каждый раз, когда функция вызывается.

func display(no1: Int) -> Int { let a = no1 return a } println(display(100)) println(display(200))

При запуске программы выше, используя игровую площадку, мы получаем следующий результат -

100 200

Параметров и возвращаемых значений

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

Функции с параметрами

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

func mult(no1: Int, no2: Int) -> Int { return no1*no2 } println(mult(2,20)) println(mult(3,15)) println(mult(4,30))

При запуске программы выше, используя игровую площадку, мы получаем следующий результат -

40 45 120

Функции без параметров

Мы также можем иметь функции без каких-либо параметров.

Синтаксис

func funcname() -> datatype { return datatype }

Ниже приведен пример, имеющий функцию без параметра -

func votersname() -> String { return "Alice" } println(votersname())

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Alice

Функции с Возвращаемые значения

Функции также используются для возврата строка, целое число, и всплывают значения типа данных, возвращаемых типов. Чтобы выяснить, наибольший и наименьший номер в 'LS' заданной функции массива объявляется с большими и малыми целыми типами данных.

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

func ls(array: [Int]) -> (large: Int, small: Int) { var lar = array[0] var sma = array[0] for i in array[1..<array.count] { if i < sma { sma = i }else if i > lar { lar = i } } return (lar, sma) } let num = ls([40,12,-5,78,98]) println("Largest number is: \(num.large) and smallest number is: \(num.small)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Largest number is: 98 and smallest number is: -5

Функции без возврата значений

Некоторые функции могут иметь аргументы, объявленные внутри функции без каких-либо возвращаемых значений. Следующая программа объявляета и Ьв качестве аргументов функции суммы (). внутри самой функции значения для аргументова и Ьпередаются путем вызова сумму вызова функции () и его значения печатаются таким образом устраняя возвращаемых значений.

func sum(a: Int, b: Int) { let a = a + b let b = a - b println(a, b) } sum(20, 10) sum(40,10) sum(24,6)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

(30, 20) (50, 40) (30, 24)

Функции с факультативным возвращаемые типы

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

Дополнительные функции будут иметь две формы 'значение' и 'ноль'. Упомянем "OPTIONALS" с ключом зарезервированный символ '?' проверить, является ли кортеж возвращается значение или значение ноль.

func minMax(array: [Int]) -> (min: Int, max: Int)? { if array.isEmpty { return nil } var currentMin = array[0] var currentMax = array[0] for value in array[1..<array.count] { if value < currentMin { currentMin = value }else if value > currentMax { currentMax = value } } return (currentMin, currentMax) } if let bounds = minMax([8, -6, 2, 109, 3, 71]) { println("min is \(bounds.min) and max is \(bounds.max)") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

min is -6 and max is 109

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

Функции Local Vs Внешние Имена параметров

Локальные имена параметров

Локальные имена параметров доступны внутри только функции.

func sample(number: Int) { println(number) }

ЗдесьFUNC номер образца аргумент объявлен как внутренней переменной , так как доступ к ней внутренне образцом функции ().Здесь 'номер' объявлен как локальная переменная, но ссылка на переменную производится вне функции со следующим утверждением -

func sample(number: Int) { println(number) } sample(1) sample(2) sample(3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

1 2 3

Внешние Имена параметров

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

func pow(firstArg a: Int, secondArg b: Int) -> Int { var res = a for _ in 1..<b { res = res * a } println(res) return res } pow(firstArg:5, secondArg:3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

125

VARIADIC Параметры

Когда мы хотим определить функцию с несколькими числом аргументов, то мы можем объявить членов как '' параметров переменным числом. Параметры могут быть определены как VARIADIC путем (···) после имени параметра.

func vari<N>(members: N...) { for i in members { println(i) } } vari(4,3,5) vari(4.5, 3.1, 5.6) vari("Swift", "Enumerations", "Closures")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

4 3 5 4.5 3.1 5.6 Swift Enumerations Closures

Константа, переменная и параметры ввода / вывода

Функции по умолчанию рассмотрим параметры, как "константа", в то время как пользователь может объявить аргументы функций как переменные также. Мы уже говорили, что "пусть" ключевое слово используется для объявления постоянных параметров и переменных параметров определяется с "Var" ключевое слово.

Параметры вывода в Swift I / обеспечивают функциональные возможности, чтобы сохранить значения параметров, даже если его значения изменяются после вызова функции. В начале определения параметров функции, "INOUT" ключевое слово объявляется сохранить значения членов.

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

Переменные передаются только в качестве аргумента для отказа в параметре поскольку одни его значения изменяются внутри и снаружи функции. Следовательно, нет необходимости объявлять строки и литералы, как и в-из параметров. '&' Перед именем переменной означает, что мы передаем аргумент параметру In-Out.

func temp(inout a1: Int, inout b1: Int) { let t = a1 a1 = b1 b1 = t } var no = 2 var co = 10 temp(&no, &co) println("Swapped values are \(no), \(co)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Swapped values are 10, 2

Типы функций и его использование

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

func inputs(no1: Int, no2: Int) -> Int { return no1/no2 }

Ниже приведен пример -

func inputs(no1: Int, no2: Int) -> Int { return no1/no2 } println(inputs(20,10)) println(inputs(36,6))

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

2 6

Здесь функция инициализируется с двумя аргументами и NO2 no1 как целочисленных типов данных и его тип возвращаемого значения также объявлен как 'Int'.

Func inputstr(name: String) -> String { return name }

Здесь функция объявлена какстрока типа данных.

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

func inputstr() { println("Swift Functions") println("Types and its Usage") } inputstr()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Swift Functions Types and its Usage

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

Использование функциональных типов

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

var addition: (Int, Int) -> Int = sum

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

func sum(a: Int, b: Int) -> Int { return a + b } var addition: (Int, Int) -> Int = sum println("Result: \(addition(40, 89))")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Result: 129

Типы функций и типы параметров & типы возвращаемых значений

Мы также можем передать функцию себя в качестве типов параметров другой функции.

func sum(a: Int, b: Int) -> Int { return a + b } var addition: (Int, Int) -> Int = sum println("Result: \(addition(40, 89))") func another(addition: (Int, Int) -> Int, a: Int, b: Int) { println("Result: \(addition(a, b))") } another(sum, 10, 20)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Result: 129 Result: 30

Вложенные функции

Вложенная функция обеспечивает возможность вызова внешней функции путем вызова внутри функции.

func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 0 func decrementer() -> Int { overallDecrement -= total return overallDecrement } return decrementer } let decrem = calcDecrement(forDecrement: 30) println(decrem())

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

-30

Затворы в Swift аналогичны автономных функций, организованных в виде блоков и называемых в любом месте, как C и Objective C языках. Константы и ссылки на переменные, определенные внутри функций фиксируются и хранятся в муфтах. Функции рассматриваются как частные случаи закрытия и принимает следующие три формы -

глобальные функции Вложенные функции Закрытие Выражения
Есть имя. Не захватывать любые значения Есть имя. Значения Capture из вмещающих функции Без имени Затворы значений захвата из соседних блоков

Закрытие выражения в Swift языка следуют четкие, оптимизации и легкие стили синтаксиса, который включает.

  • Выведение параметр и возвращать типы значений из контекста.
  • Неявные возвращается из одного выражения затворами.
  • Сокращенные имена аргументов и
  • Скользящий синтаксис закрытия

Синтаксис

Ниже приводится общий синтаксис для определения закрытия, который принимает параметры и возвращает тип данных -

{(parameters) -> return type in statements }

Ниже приведен простой пример -

let studname = { println("Welcome to Swift Closures") } studname()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Welcome to Swift Closures

После закрытия принимает два параметра и возвращает значение Bool -

{(Int, Int) -> Bool in Statement1 Statement 2 --- Statement n }

Ниже приведен простой пример -

let divide = {(val1: Int, val2: Int) -> Int in return val1 / val2 } let result = divide(200, 20) println (result)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

10

Выражения в муфтах

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

По возрастанию по программе заказа

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

Два аргумента представлены в отсортированном функции -

  • Значения известного типа, представленного в виде массивов.

  • Содержимое массива (Int, Int) и возвращает логическое значение (Bool), если массив отсортирован правильно он будет возвращать истинное значение в противном случае она вернет ложь.

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

func ascend(s1: String, s2: String) -> Bool { return s1 > s2 } let stringcmp = ascend("swift", "great") println (stringcmp)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

true

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

Синтаксис выражений Закрытие использует -

  • постоянные параметры,
  • переменные параметры, и
  • INOUT параметры.

Выражение Закрытие не поддерживает значения по умолчанию. VARIADIC параметры и Кортежи также можно использовать в качестве типов параметров и возвращаемых типов.

let sum = {(no1: Int, no2: Int) -> Int in return no1 + no2 } let digits = sum(10, 20) println(digits)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

30

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

Одно Expression Неявные Возвращает

Здесь функция тип второго аргумента отсортированного функция делает ясно, что значение Bool должен быть возвращен закрытия. Поскольку тело Замыкание содержит одно выражение (s1> s2), которая возвращает булево значение, нет никакой двусмысленности, и возвращение ключевого слова может быть опущен.

Для возврата единого отчета выражение в «возвращении» ключевого слова Expression закрытий опущен в своей декларации части.

let count = [5, 10, -6, 75, 20] var descending = sorted(count, { n1, n2 in n1 > n2 }) var ascending = sorted(count, { n1, n2 in n1 < n2 }) println(descending) println(ascending)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[75, 20, 10, 5, -6] [-6, 5, 10, 20, 75]

Само заявление четко определяет, что, когда string1 больше, чем строка 2 возвращает истину иначе ложь, следовательно, оператор возврата здесь опускается.

Известные Затворы Тип

Рассмотрим сложение двух чисел. Мы знаем, что дополнение будет возвращать целое число типа данных. Поэтому известные затворы типа объявлены как -

let sub = {(no1: Int, no2: Int) -> Int in return no1 - no2 } let digits = sub(10, 20) println(digits)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

-10

Декларирование стенографии аргументе имена, как Closures

Swift автоматически предоставляет сокращенные имена аргументов встраивать затворы, которые могут быть использованы для обозначения значений аргументами замыкания именами $ 0, $ 1, $ 2, и так далее.

var shorthand: (String, String) -> String shorthand = { $1 } println(shorthand("100", "200"))

Здесь $ 0 и $ 1 относятся к первой и второй аргументы Струнные Замыкание в.

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

200

Swift облегчает пользователю представлять Роликовые закрытий, обозначающим имен аргументов, представляя $ 0, $ 1, $ 2 --- $ п.

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

Затворы как оператор-функций

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

Выражение становится еще проще с помощью функции оператора в замыкании, как -

let numb = [98, -20, -30, 42, 18, 35] var sortedNumbers = numb.sorted({ (left: Int, right: Int) -> Bool in return left < right }) let asc = numb.sorted(<) println(asc)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[-30, -20, 18, 35, 42, 98]

Затворы как трейлеры

Переходя окончательный аргумент функции к выражению закрытия объявляется с помощью 'Скользящего Closures'. Она написана вне функции () с {}. Его использование необходимо, когда не представляется возможным писать встраиваемая функция на одной строке.

reversed = sorted(names) { $0 > $1}

где {$ 0> $ 1} представлены в виде концевых затворов объявленных вне (имена).

import Foundation var letters = ["North", "East", "West", "South"] let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString }) let stletters = letters.map() { $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString } println(stletters)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[NO, EA, WE, SO]

Захватив значений и ссылочных типов

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

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

Вложенная функция захватывает -

  • Внешние аргументы функции.
  • Захват константы и переменные, определенные внутри внешней функции.

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

let decrem = calcDecrement(forDecrement: 18) decrem()

ЗдесьoneDecrement и декремента переменные оба указывают тот же блок памяти в качестве эталона закрытия.

func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total println(overallDecrement) return overallDecrement } return decrementer } let decrem = calcDecrement(forDecrement: 18) decrem() decrem() decrem()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

82 64 46

Когда каждый раз, когда внешняя функция calcDecrement называется это вызывает функцию decrementer () и уменьшает значение на 18 и возвращает результат с помощью внешней функции calcDecrement. Здесь calcDecrement действует в качестве крышки.

Даже если функция decrementer () не имеет каких-либо аргументов закрытия по умолчанию относится к переменным 'overallDecrement' и '' общей, захватив свои существующие значения. Копия значений для указанных переменных сохраняются с помощью функции нового decrementer (). Swift обрабатывает функции управления памятью выделения и освобождения пространства памяти, когда переменные не используются.

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

Перечень Функциональность

Перечисление в Свифт также напоминает структуру C и Objective C.

  • Он объявлен в классе и его значения доступны через экземпляр этого класса.

  • Начальное значение члена определяется с использованием перечислений инициализаторы.

  • Его функциональные возможности также расширены за счет обеспечения стандартные функциональные возможности протокола.

Синтаксис

Перечисления вводятся с перечислимом ключевого слова и поместить всю их определение внутри пары скобок -

enum enumname { // enumeration values are described here }

Например, вы можете определить перечисление для дней недели следующим образом -

enum DaysofaWeek { case Sunday case Monday --- case Saturday }

пример

enum names { case Swift case Closures } var lang = names.Closures lang = .Closures switch lang { case .Swift: println("Welcome to Swift") case .Closures: println("Welcome to Closures") default: println("Introduction") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Welcome to Closures

Swift перечисление не присваивает его значение по умолчанию, как члены C и Objective C. Вместо того, чтобы члены явно определены по именам их перечисления. Название Перечисление должно начинаться с заглавной буквы (Ex: перечисление DaysofaWeek).

var weekDay = DaysofaWeek.Sunday

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

Перечисление с выключателем Заявление

Swift 'Переключатель' утверждение следует также мульти выбор пути. Только одна переменная доступна в определенный момент времени на основе заданного условия. По умолчанию случай переключатель заявление используется для улавливания неопределенных случаев.

enum Climate { case India case America case Africa case Australia } var season = Climate.America season = .America switch season { case .India: println("Climate is Hot") case .America: println("Climate is Cold") case .Africa: println("Climate is Moderate") case .Australia: println("Climate is Rainy") default: println("Climate is not predictable") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Climte is Cold

Программа сначала определяет климат в качестве имени перечисления. Тогда ее члены, как "Индия", "Америка", "Африка" и "Австралия" объявлены принадлежность к классу «климата». Теперь Америка член присваивается сезон переменной. Кроме того, коммутатор случай будет видеть значения, соответствующие .America и он будет перейти к этому конкретному заявлению. Выход будет отображаться как "климат холодный". Точно так же все члены могут быть доступны через отчетности коммутатора. Если условие не выполняется он печатает по умолчанию 'климата не является предсказуемым ».

Перечень может быть дополнительно классифицированы и соответствующих значений и исходных значений.

Разница между соответствующими значениями и необработанные значения

Связанные значения Сырые значения
Различные типы данных Те же Datatypes
Пример: {перечислимый 10,0.8, "Hello"} Пример: {перечислимый 10,35,50}
Ценности формируются на основе постоянной или переменной заполняемых Значения
Варьируется при объявлении каждый раз Значение для элемента такое же

Enum с соответствующими значениями

enum Student { case Name(String) case Mark(Int,Int,Int) } var studDetails = Student.Name("Swift") var studMarks = Student.Mark(98,97,95) switch studMarks { case .Name(let studName): println("Student name is: \(studName).") case .Mark(let Mark1, let Mark2, let Mark3): println("Student Marks are: \(Mark1),\(Mark2),\(Mark3).") default: println("Nothing") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Swift 98 97 95

Рассмотрим, например, чтобы получить доступ к имени студентов и знаки закреплены в трех субъектов имени перечисления объявлен как студент и члены, присутствующие в классе перечислений имя, которое принадлежит к типу данных строки, знаки представлены как mark1, Mark2 и Mark3 типа данных Integer. Чтобы получить доступ либо имя студента или знаки они набрали.

var studDetails = Student.Name("Swift") var studMarks = Student.Mark(98,97,95)

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

Enum с самими значениями

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

enum Month: Int { case January = 1, February, March, April, May, June, July, August, September, October, November, December } let yearMonth = Month.May.rawValue println("Value of the Month is: \(yearMonth).")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Value of the Month is: 5.

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

В отличие от C и Objective C

  • Структура не обязательно требует файлы реализации и интерфейса.

  • Структура позволяет создать единый файл и автоматически расширять свой интерфейс к другим блокам.

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

Синтаксис

Structures are defined with a 'Struct' Keyword. struct nameStruct { Definition 1 Definition 2 --- Definition N }

Определение структуры

Возьмем, к примеру, предположим, что мы должны получить доступ к студентам записи, содержащие метки из трех предметов и выяснить, в общей сложности из трех предметов. Здесь markStruct используется для инициализации структуры с тремя знаками, как тип данных 'Int'.

struct MarkStruct { var mark1: Int var mark2: Int var mark3: Int }

Доступ к структуры и ее свойства

Члены структуры обращаются по имени структуры. Экземпляры структуры инициализируются 'давайте ключевому слову.

struct studentMarks { var mark1 = 100 var mark2 = 200 var mark3 = 300 } let marks = studentMarks() println("Mark1 is \(marks.mark1)") println("Mark2 is \(marks.mark2)") println("Mark3 is \(marks.mark3)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Mark1 is 100 Mark2 is 200 Mark3 is 300

Студенты знаки обращаются по имени структуры 'studentMarks'. Члены структуры инициализируется как mark1, Mark2, Mark3 со значениями целого типа. Тогда структура studentMarks () передается на "знаки" с "давайте ключевое слово. Здесь и далее 'знаки' будет содержать значения члена структуры. Теперь значения печатаются доступа к значениям элемента структуры путем '.' с его инициализированными именами.

struct MarksStruct { var mark: Int init(mark: Int) { self.mark = mark } } var aStruct = MarksStruct(mark: 98) var bStruct = aStruct // aStruct and bStruct are two structs with the same value! bStruct.mark = 97 println(aStruct.mark) // 98 println(bStruct.mark) // 97

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

98 97

Рекомендации Использование структур

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

Необходимость структур, имеющих

  • Для того, чтобы инкапсулировать простые значения данных.

  • Чтобы скопировать инкапсулированные данные и связанные с ним свойства, "ценности", а не "ссылки".

  • Структура для 'Копировать' и 'Reference'.

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

struct markStruct { var mark1: Int var mark2: Int var mark3: Int init(mark1: Int, mark2: Int, mark3: Int) { self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } } var marks = markStruct(mark1: 98, mark2: 96, mark3:100) println(marks.mark1) println(marks.mark2) println(marks.mark3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

98 96 100

Другой пример

struct markStruct { var mark1: Int var mark2: Int var mark3: Int init(mark1: Int, mark2: Int, mark3: Int){ self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } } var fail = markStruct(mark1: 34, mark2: 42, mark3: 13) println(fail.mark1) println(fail.mark2) println(fail.mark3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

34 42 13

Структура 'markStruct' определяется первым со своими членами mark1, Mark2 и Mark3. Теперь переменные классов членов инициализируются для хранения целочисленных значений. Затем копия членов структуры создаются с "самости" по ключевым словам. После того, как копия элементов структуры создаются структуры блока с его параметров меток передаются переменной 'знаков', которая теперь будет держать студентов знаки. Тогда знаки печатаются как 98, 96, 100. Следующий шаг для одних и тех же элементов структуры другой экземпляр с именем "сбой" используется, чтобы указать те же элементы структуры с разными знаками. Затем результаты теперь печатается как 34, 42, 13. Это ясно объясняет, что структуры будут иметь копию переменных-членов затем передать членам их предстоящих функциональных блоков.

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

Преимущества наличия классов

  • Наследование приобретает свойства одного класса к другому классу
  • Приведение типов позволяет пользователю проверять тип класса во время выполнения
  • Deinitializers заботиться о высвободить ресурсы памяти
  • Подсчет ссылок позволяет экземпляр класса иметь более одной ссылки

Общие характеристики классов и структур

  • Свойства определяются для хранения значений
  • Нижние индексы определены для обеспечения доступа к значениям
  • Методы инициализации для улучшения функциональных возможностей
  • Исходное состояние определяются инициализаторах
  • Функциональные возможности расширены за пределы значений по умолчанию
  • Подтверждая функциональность стандартов протокола

Синтаксис

Class classname { Definition 1 Definition 2 --- Definition N }

Определение класса

class student { var studname: String var mark: Int var mark2: Int }

Синтаксис для создания экземпляров

let studrecord = student()

пример

class MarksStruct { var mark: Int init(mark: Int) { self.mark = mark } } class studentMarks { var mark = 300 } let marks = studentMarks() println("Mark is \(marks.mark)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Mark is 300

Доступ к свойствам класса, как ссылочных типов

Свойства класса могут быть доступны с помощью '.' синтаксис. Имя свойства разделяются символом '.' после того, как имя экземпляра.

class MarksStruct { var mark: Int init(mark: Int) { self.mark = mark } } class studentMarks { var mark1 = 300 var mark2 = 400 var mark3 = 900 } let marks = studentMarks() println("Mark1 is \(marks.mark1)") println("Mark2 is \(marks.mark2)") println("Mark3 is \(marks.mark3)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Mark1 is 300 Mark2 is 400 Mark3 is 900

Класс идентичности Операторы

Классы в Swift относится несколько константы и переменные, указывающие на один экземпляр. Чтобы узнать о постоянных и переменных, указывающих на конкретного экземпляра класса используются операторы идентичности. Экземпляры классов всегда передаются по ссылке. В классах экземпляры NSString, NSArray и NSDictionary всегда назначаются и розданы в качестве ссылки на существующий экземпляр, а не в качестве копии.

Идентичный операторов Не Идентичный операторов
Оператор используется (===) Оператор используется (! ==)
Возвращает истину, когда две константы или переменные, указывающие на тот же экземпляр Возвращает истину, когда две константы или переменные, указывающие на другой экземпляр
class SampleClass: Equatable { let myProperty: String init(s: String) { myProperty = s } } func ==(lhs: SampleClass, rhs: SampleClass) -> Bool { return lhs.myProperty == rhs.myProperty } let spClass1 = SampleClass(s: "Hello") let spClass2 = SampleClass(s: "Hello") spClass1 === spClass2 // false println("\(spClass1)") spClass1 !== spClass2 // true println("\(spClass2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

main.SampleClass main.SampleClass

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

Разница между хранимыми свойств и вычисленных свойств.

Хранится недвижимости Компьютерная недвижимость
Хранить постоянные и переменные значения, например. Вычислить значение, а не сохранения значения.
Предоставлено классов и структур. Предоставлено классов, перечислений и структур.

Оба Хранимые и вычисляемые свойства связаны с типом экземпляров. Когда свойства связаны с его значениями типа, то она определяется как "Свойства типа". Хранимые и вычисляемые свойства, как правило, связаны с экземплярами определенного типа. Тем не менее, свойства также могут быть связаны с самим типом. Такие свойства известны как свойства типа. также используются наблюдатели собственности.

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

Хранимые Свойства

Swift вводит Хранимые понятие собственности для хранения экземпляров констант и переменных. Хранимые свойства констант определяются 'давайте ключевым словом и Хранится свойства переменных определяются "Var" ключевое слово.

  • При определении Хранится свойство обеспечивает "значение по умолчанию".
  • Во время инициализации пользователь может инициализировать и изменять начальные значения.
struct Number{ var digits: Int let pi = 3.1415 } var n = Number(digits: 12345) n.digits = 67 println("\(n.digits)") println("\(n.pi)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

67 3.1415

Рассмотрим следующую строку в коде выше -

let pi = 3.1415

Здесь переменная пи инициализируется как хранимая значение свойства с экземпляром р = 3.1415. Таким образом, всякий раз, когда экземпляр называется оно будет содержать значение 3,1415 в одиночку.

Другой способ сохранили свойство иметь как постоянные структуры. Таким образом, весь экземпляр структуры будет рассматриваться как хранившихся свойства Константы ».

struct Number { var digits: Int let numbers = 3.1415 } var n = Number(digits: 12345) n.digits = 67 println("\(n.digits)") println("\(n.numbers)") n.numbers = 8.7

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

error: cannot assign to 'numbers' in 'n' n.numbers = 8.7

Вместо того, чтобы переинициализации 'число' до 8,7 он будет возвращать сообщение об ошибке, указывающее, что 'число' объявлен как константа.

Ленивый Хранится недвижимости

Swift обеспечивает гибкое свойство, называемое "Ленивый Хранится Property ', где он не будет вычислять начальные значения, когда переменная инициализируется в первый раз. 'Ленивым' используется модификатор перед объявлением переменной, чтобы иметь его в качестве ленивого хранится имущество.

Ленивые свойства используются -

  • Для того, чтобы отсрочить создание объекта.
  • Когда свойство зависит от других частей класса, которые еще не известны.
class sample { lazy var no = number() // `var` declaration is required. } class number { var name = "Swift" } var firstsample = sample() println(firstsample.no.name)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Swift

Переменные экземпляра

В Objective C, Хранимые свойства также имеют переменные экземпляра для резервного копирования целей для хранения значений, объявленных в хранимой собственности.

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

Рассчитанные Свойства

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

class sample { var no1 = 0.0, no2 = 0.0 var length = 300.0, breadth = 150.0 var middle: (Double, Double) { get{ return (length / 2, breadth / 2) }set(axis) { no1 = axis.0 - (length / 2) no2 = axis.1 - (breadth / 2) } } } var result = sample() println(result.middle) result.middle = (0.0, 10.0) println(result.no1) println(result.no2)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

(150.0, 75.0) -150.0 -65.0

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

Рассчитанные свойства как свойства только для чтения

Только для чтения свойство в вычисленной собственности определяется как свойство с геттер, но не сеттера. Он всегда используется для возврата значения. Переменные дополнительно доступны через '.' Синтаксис, но не может быть установлен на другое значение.

class film { var head = "" var duration = 0.0 var metaInfo: [String:String] { return [ "head": self.head, "duration":"\(self.duration)" ] } } var movie = film() movie.head = "Swift Properties" movie.duration = 3.09 println(movie.metaInfo["head"]!) println(movie.metaInfo["duration"]!)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Swift Properties 3.09

Вычисляемые свойства в качестве наблюдателей собственности

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

Обозреватели свойство может быть определено либо.

  • Перед сохранением значения - willset.

  • После сохранения нового значения - didset.

  • Когда свойство установлено в инициализатора willset и didset наблюдатели нельзя назвать.

class Samplepgm { var counter: Int = 0 { willSet(newTotal) { println("Total Counter is: \(newTotal)") } didSet { if counter > oldValue { println("Newly Added Counter \(counter - oldValue)") } } } } let NewCounter = Samplepgm() NewCounter.counter = 100 NewCounter.counter = 800

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700

Локальные и глобальные переменные

Локальные и глобальные переменные объявляются для вычисления и наблюдения свойств.

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

Свойства Тип

Свойства определяются в разделе Определение типа с помощью фигурных скобок {} и области действия переменных также определены ранее. Для определения свойств типа для "статического" ключевого слова типов значений используется и "класс" ключевого слова типов классов используется.

Синтаксис

struct Structname { static var storedTypeProperty = " " static var computedTypeProperty: Int { // return an Int value here } } enum Enumname { static var storedTypeProperty = " " static var computedTypeProperty: Int { // return an Int value here } } class Classname { class var computedTypeProperty: Int { // return an Int value here } }

Опрос и Настройка свойств

Так же, как свойства свойства экземпляра Тип опрашиваются и устанавливается с '.' Синтаксис только на одном только вместо того, чтобы указывать на экземпляр типа.

struct StudMarks { static let markCount = 97 static var totalCount = 0 var InternalMarks: Int = 0 { didSet { if InternalMarks > StudMarks.markCount { InternalMarks = StudMarks.markCount } if InternalMarks > StudMarks.totalCount { StudMarks.totalCount = InternalMarks } } } } var stud1Mark1 = StudMarks() var stud1Mark2 = StudMarks() stud1Mark1.InternalMarks = 98 println(stud1Mark1.InternalMarks) stud1Mark2.InternalMarks = 87 println(stud1Mark2.InternalMarks)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

97 87

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

Методы экземпляра

В Swift языка, классы, структуры и экземпляры Перечислительные доступны через методы экземпляра.

Методы экземпляра обеспечивают функциональные возможности.

  • Чтобы получить доступ и изменять свойства экземпляра.
  • функциональные возможности, связанные с потребностью экземпляра.

Метод экземпляра может быть записана внутри {} фигурные скобки. Она имеет неявный доступ к методам и свойствам экземпляра типа. Когда конкретный экземпляр типа называется он получит доступ к этому конкретному экземпляру.

Синтаксис

func funcname(Parameters) -> returntype { Statement1 Statement2 --- Statement N return parameters }

пример

class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b } func tot(c: Int) -> Int { return res - c } func result() { println("Result is: \(tot(20))") println("Result is: \(tot(50))") } } let pri = calculations(a: 600, b: 300) pri.result()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Result is: 880 Result is: 850

Расчеты Класс определяет два метода экземпляра -

  • Init () определяется для сложения двух чисел а и Ь и хранить его в результате "Рез"
  • TOT () используется для вычесть 'Рез' от проезжающих 'C' значение

И, наконец, для печати методы вычисления со значениями для а и Ь называется. Методы экземпляра доступны с '.' синтаксис точка

Локальные и внешние имена параметров

Swift функции описывают как локальные и глобальные объявления для их переменных. Аналогичным образом, методы Swift соглашения об именах также напоминает, что и Objective C. Но характеристики локальных и глобальных деклараций имя параметра различны для функций и методов. Первый параметр в стрижа называются по именам Предлог как 'с', 'за' и 'на' для легкого доступа к именования.

Swift обеспечивает гибкость в методах, объявив имя параметра, как локальные имена параметров, а остальные имена параметров быть глобальных имен параметров. Здесь 'нет1' объявляется быстрыми методами, как локальных имен параметров. 'Нет2' используется для глобальных деклараций и доступ к ним через вне программы.

class division { var count: Int = 0 func incrementBy(no1: Int, no2: Int) { count = no1 / no2 println(count) } } let counter = division() counter.incrementBy(1800, no2: 3) counter.incrementBy(1600, no2: 5) counter.incrementBy(11000, no2: 3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

600 320 3666

Внешнее имя параметра с # и _ Символ

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

Когда пользователю необходимо получить доступ последующие имена параметров с внешним именем, имя метода перекрывается с помощью символ '_'.

class multiplication { var count: Int = 0 func incrementBy(#no1: Int, no2: Int) { count = no1 * no2 println(count) } } let counter = multiplication() counter.incrementBy(no1: 800, no2: 3) counter.incrementBy(no1: 100, no2: 5) counter.incrementBy(no1: 15000, no2: 3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

2400 500 45000

Само свойство в методах

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

class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b println("Inside Self Block: \(res)") } func tot(c: Int) -> Int { return res - c } func result() { println("Result is: \(tot(20))") println("Result is: \(tot(50))") } } let pri = calculations(a: 600, b: 300) let sum = calculations(a: 1200, b: 300) pri.result() sum.result()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Inside Self Block: 900 Inside Self Block: 1500 Result is: 880 Result is: 850 Result is: 1480 Result is: 1450

Изменение типов значений из методов экземпляра

В Swift языковые структуры и перечислений принадлежат ценить типы, которые не могут быть изменены с помощью ее методов экземпляра. Тем не менее, быстрый язык обеспечивает гибкость изменять типы значений с помощью "мутагенными" поведения. Mutate будет делать какие-либо изменения в методах экземпляра и вернется к первоначальной форме после выполнения метода. Кроме того, на «я» собственности создается новый экземпляр для своей неявной функции и заменит существующий метод после его исполнения

struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { length *= res breadth *= res println(length) println(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(3) val.scaleBy(30) val.scaleBy(300)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

9 15 270 450 81000 135000

Само Свойство для метода мутирует

Минимальное видоизменение методы в сочетании со свойством "самости" присваивает новый экземпляр для определенного метода.

struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { self.length *= res self.breadth *= res println(length) println(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(13)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

39 65

Методы типа

Когда конкретный экземпляр метода называется, это называется как метод экземпляра; и когда метод вызывает особый тип метода, он называется как "методы типа". Методы типа для 'классов' определяются 'Func' ключевых слов и структур и методов типа перечислений определяются с "статическим" ключевое слово перед "Func" ключевого слова.

Методы типа называются и доступ к '.' синтаксис, где вместо вызова конкретного экземпляра вызывается весь метод.

class Math { class func abs(number: Int) -> Int { if number < 0 { return (-number) }else { return number } } } struct absno { static func abs(number: Int) -> Int { if number < 0 { return (-number) }else { return number } } } let no = Math.abs(-35) let num = absno.abs(-5) println(no) println(num)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

35 5

Доступ к членам элементом коллекции, последовательности и список классов, Структуры и Перечисления осуществляются с помощью индексов. Эти индексы используются для хранения и извлечения значений с помощью индекса. Доступ к элементам матрицы с помощью SomeArray [Индекс] и его последующих элементов членов в словаре экземпляра могут быть доступны как someDicitonary [ключ].

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

Подстрочный Декларация Синтаксис и его использование

Давайте резюмировать к вычисленных свойств. Нижние индексы тоже тот же синтаксис, что и вычисляемых свойств. Для выполнения запросов экземпляров типа, нижние индексы написаны внутри квадратных скобок, затем с именем экземпляра. Подстрочный синтаксис имеет ту же структуру синтаксиса, что и '' метод экземпляра и синтаксис 'вычислен собственность'. 'Нижний индекс' ключевое слово используется для определения индексов и пользователь может указать один или несколько параметров с их типами возврата. Индексы могут иметь чтения-записи или только для чтения свойства и экземпляры хранятся и извлекаются с помощью «добытчика» и «инкубационные» свойствами, которые вычисляемых свойств.

Синтаксис

subscript(index: Int) -> Int { get { // used for subscript value declarations } set(newValue) { // definitions are written here } }

Пример1

struct subexample { let decrementer: Int subscript(index: Int) -> Int { return decrementer / index } } let division = subexample(decrementer: 100) println("The number is divisible by \(division[9]) times") println("The number is divisible by \(division[2]) times") println("The number is divisible by \(division[3]) times") println("The number is divisible by \(division[5]) times") println("The number is divisible by \(division[7]) times")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

The number is divisible by 11 times The number is divisible by 50 times The number is divisible by 33 times The number is divisible by 20 times The number is divisible by 14 times

Example2

class daysofaweek { private var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "saturday"] subscript(index: Int) -> String { get { return days[index] } set(newValue) { self.days[index] = newValue } } } var p = daysofaweek() println(p[0]) println(p[1]) println(p[2]) println(p[3])

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Sunday Monday Tuesday Wednesday

Функции в Подстрочный

Нижние индексы принимает одного до нескольких входных параметров, и эти входные параметры также относятся к любому типу данных. Они также могут использовать переменные и параметры VARIADIC. Нижние индексы не могут обеспечить значения параметров по умолчанию или использовать любые In-Out параметров.

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

struct Matrix { let rows: Int, columns: Int var print: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns print = Array(count: rows * columns, repeatedValue: 0.0) } subscript(row: Int, column: Int) -> Double { get { return print[(row * columns) + column] } set { print[(row * columns) + column] = newValue } } } var mat = Matrix(rows: 3, columns: 3) mat[0,0] = 1.0 mat[0,1] = 2.0 mat[1,0] = 3.0 mat[1,1] = 5.0 println("\(mat[0,0])") println("\(mat[0,1])") println("\(mat[1,0])") println("\(mat[1,1])")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

1.0 2.0 3.0 5.0

Swift индекс поддерживает один параметр для нескольких деклараций параметров для соответствующих типов данных. Программа объявляет структуру 'Матрица' как двухмерной матрицы массива 2 * 2 для сохранения 'Double' типы данных. Параметр Матрица вводится с типами данных Integer для объявления строк и столбцов.

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

var mat = Matrix(rows: 3, columns: 3)

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

mat[0,0] = 1.0 mat[0,1] = 2.0 mat[1,0] = 3.0 mat[1,1] = 5.0

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

  • Sub Class - когда класс наследует свойства, методы и функции из другого класса она называется подклассов

  • Супер Класс - Класс , содержащий свойства, методы и функции , чтобы наследовать другие классы от самого себя называется суперкласса

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

Базовый класс

Класс, который не наследует методы, свойства или функции из другого класса, называется как "базового класса.

class StudDetails { var stname: String! var mark1: Int! var mark2: Int! var mark3: Int! init(stname: String, mark1: Int, mark2: Int, mark3: Int) { self.stname = stname self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } } let stname = "swift" let mark1 = 98 let mark2 = 89 let mark3 = 76 println(stname) println(mark1) println(mark2) println(mark3)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

swift 98 89 76

Класс с Classname StudDetails определяются как базовый класс здесь, который используется, чтобы содержать студентов имя, и три предмета пометить как mark1, Mark2 и Mark3. "Пусть" ключевое слово используется для инициализации значения для значения класса базового класса и базовой отображается на детской площадке с помощью '' Println функции.

Подкласс

Акт основе нового класса на существующий класс определяется как "Подкласс". Подкласс наследует свойства, методы и функции базового класса. Для определения подкласса ':' используется перед именем базового класса.

class StudDetails { var mark1: Int; var mark2: Int; init(stm1:Int, results stm2:Int) { mark1 = stm1; mark2 = stm2; } func print() { println("Mark1:\(mark1), Mark2:\(mark2)") } } class display : StudDetails { init() { super.init(stm1: 93, results: 89) } } let marksobtained = display() marksobtained.print()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Mark1:93, Mark2:89

'StudDetails' класс определяется как супер класс, где были объявлены студенческие знаки и "Дисплей" подкласса используется, чтобы наследовать следы от своего суперкласса. Sub класс определяет студентов знаков и вызывает метод печати () для отображения метки студентов.

Перекрытие

Доступ к экземпляра супер класс, методы типа, например, свойства типа и нижние индексы подкласс обеспечивает концепцию переопределение. 'Переопределение' используется ключевое слово, чтобы переопределить методы, объявленные в суперклассе.

Доступ к суперкласса методы, свойства и подстрочный

'Супер' ключевое слово используется в качестве префикса для доступа к методам, свойствам и нижние индексы, объявленные в родительском классе.

Перекрытие Доступ к методам, свойствам и нижние индексы
методы super.somemethod ()
свойства super.someProperty ()
Нижние индексы супер [someIndex]

Методы Переопределение

Унаследованные методы экземпляра и типа могут быть переопределены ставиться ключевое слово для наших методов, определенных в нашем подклассе. Здесь печать () переписан в подклассе для доступа к свойству типа, упомянутого в суперкласса печати (). Кроме того, новый экземпляр крикет () супер класс создается как 'cricinstance'.

class cricket { func print() { println("Welcome to Swift Super Class") } } class tennis: cricket { override func print() { println("Welcome to Swift Sub Class") } } let cricinstance = cricket() cricinstance.print() let tennisinstance = tennis() tennisinstance.print()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Welcome to Swift Super Class Welcome to Swift Sub Class

Свойство Перекрытие

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

Замещение собственности геттеры и сеттеры

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

Это можно сделать двумя способами -

  • Когда сеттер определяется для переопределение свойства пользователь должен определить поглотитель тоже.

  • Когда мы не хотим, чтобы изменить унаследованное свойство геттер, мы можем просто передать наследуемое значение с помощью синтаксиса '' super.someProperty к суперкласса.

class Circle { var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 println("Radius \(rect.area)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius of rectangle for 25.0 is now overridden as 3

Переопределение Наблюдатели недвижимости

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

class Circle { var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 println("Radius \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 println("Radius \(sq.area)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius of rectangle for 25.0 is now overridden as 3 Radius of rectangle for 100.0 is now overridden as 21

Окончательный недвижимости, чтобы предотвратить Переопределение

Когда пользователю не нужно хочет получить доступ к другим супер методы класса, свойства или нижние индексы "окончательное" собственности Свифт вводит, чтобы предотвратить переопределение. После того, как "окончательное" свойство объявлено подстрочные не допустит супер методы класса, свойства и его нижние индексы должны быть переопределены. Там не предусмотрено, чтобы иметь свойство "окончательное" в "супер-класса». Когда 'окончательное' свойство объявляется пользователь ограничивается, чтобы создать дополнительные классы суб.

final class Circle { final var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 println("Radius \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 println("Radius \(sq.area)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

<stdin>:14:18: error: var overrides a 'final' var override var area: String { ^ <stdin>:7:9: note: overridden declaration is here var area: String { ^ <stdin>:12:11: error: inheritance from a final class 'Circle' class Rectangle: Circle { ^ <stdin>:25:14: error: var overrides a 'final' var override var radius: Double { ^ <stdin>:6:14: note: overridden declaration is here final var radius = 12.5

Так как супер класс объявлен как «окончательный» и его типы данных также объявлены как "окончательный" программа не позволит создавать подклассы дальше и он будет бросать ошибки.

Классы, структуры и перечислений однажды объявленные в Swift инициализируются для получения экземпляра класса. Начальное значение инициализации для сохраненного имущества, а также для новых экземпляров тоже значения инициализируются идти дальше. Ключевое слово, чтобы создать функцию инициализации выполняется с помощью метода "Init () '. Swift инициализатор отличается от Objective-C, что она не возвращает никаких значений. Его функция состоит в проверке инициализации вновь созданных экземпляров до его обработки. Swift также обеспечивает процесс 'деинициализации' для выполнения операций управления памятью, как только экземпляры высвобождены.

Initializer Роль для сохраняемых свойств

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

  • Для создания начального значения.

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

  • Для инициализации экземпляра для конкретного типа данных 'Init ()' используется. Никакие аргументы не передаются в функции инициализации ().

Синтаксис

init() { //New Instance initialization goes here }

пример

struct rectangle { var length: Double var breadth: Double init() { length = 6 breadth = 12 } } var area = rectangle() println("area of rectangle is \(area.length*area.breadth)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area of rectangle is 72.0

Здесь структура "прямоугольник" инициализируется с длиной членов и ширину, как типы данных "двойным". Метод Init () используется для инициализации значения для вновь созданной длины членов и дважды. Площадь прямоугольника вычисляется и возвращается путем вызова функции прямоугольник.

Установка значений свойств по умолчанию

Swift язык обеспечивает функцию Init () для инициализации сохраненных значений свойств. Кроме того, пользователь имеет положение для инициализации значений свойств по умолчанию при объявлении членов класса или структуры. Когда свойство принимает то же значение в одиночку в течение всей программы мы можем объявить его в разделе объявлений в одиночку, а не в его инициализации Init (). Установка значений свойств по умолчанию позволяет пользователю, когда наследование определено для классов или структур.

struct rectangle { var length = 6 var breadth = 12 } var area = rectangle() println("area of rectangle is \(area.length*area.breadth)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area of rectangle is 72.0

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

Параметры инициализации

В Swift языке пользователь имеет положение для инициализации параметров как часть определения с помощью инициализации инициализаторе (в).

struct Rectangle { var length: Double var breadth: Double var area: Double init(fromLength length: Double, fromBreadth breadth: Double) { self.length = length self.breadth = breadth area = length * breadth } init(fromLeng leng: Double, fromBread bread: Double) { self.length = leng self.breadth = bread area = leng * bread } } let ar = Rectangle(fromLength: 6, fromBreadth: 12) println("area is: \(ar.area)") let are = Rectangle(fromLeng: 36, fromBread: 12) println("area is: \(are.area)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area is: 72.0 area is: 432.0

Локальные и внешние параметры

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

Чтобы преодолеть это, Swift вводит автоматическое внешнее имя для каждого параметра в Init (). Это автоматическое внешнее имя как эквивалент, как локальное имя написанного перед каждым параметром инициализации.

struct Days { let sunday, monday, tuesday: Int init(sunday: Int, monday: Int, tuesday: Int) { self.sunday = sunday self.monday = monday self.tuesday = tuesday } init(daysofaweek: Int) { sunday = daysofaweek monday = daysofaweek tuesday = daysofaweek } } let week = Days(sunday: 1, monday: 2, tuesday: 3) println("Days of a Week is: \(week.sunday)") println("Days of a Week is: \(week.monday)") println("Days of a Week is: \(week.tuesday)") let weekdays = Days(daysofaweek: 4) println("Days of a Week is: \(weekdays.sunday)") println("Days of a Week is: \(weekdays.monday)") println("Days of a Week is: \(weekdays.tuesday)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Days of a Week is: 1 Days of a Week is: 2 Days of a Week is: 3 Days of a Week is: 4 Days of a Week is: 4 Days of a Week is: 4

Параметры без внешних имен

Когда внешнее имя не требуется для инициализации подчеркивания '_' используется для изменения поведения по умолчанию.

struct Rectangle { var length: Double init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) println("area is: \(rectarea.length)") let rearea = Rectangle(370.0) println("area is: \(rearea.length)") let recarea = Rectangle(110.0) println("area is: \(recarea.length)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area is: 180.0 area is: 370.0 area is: 110.0

Дополнительные типы недвижимости

Когда хранится свойство в какой-то инстанции не возвращает никакого значения, что свойство объявлено с 'ТИнструкциям типа, указывающий, что "никакого значения" не возвращается для этого конкретного типа. Когда хранимая свойство объявлено как "опция" автоматически инициализирует значение, чтобы быть 'ноль' во время самой инициализации.

struct Rectangle { var length: Double? init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) println("area is: \(rectarea.length)") let rearea = Rectangle(370.0) println("area is: \(rearea.length)") let recarea = Rectangle(110.0) println("area is: \(recarea.length)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area is: Optional(180.0) area is: Optional(370.0) area is: Optional(110.0)

Изменение констант свойств во время инициализации

Инициализация также позволяет пользователю изменять значение константы собственности тоже. Во время инициализации класса свойство позволяет его экземпляры класса, которые должны быть изменены суперкласса и не подклассом. Рассмотрим, например, в предыдущей программе 'длина' объявлен как 'переменной' в главном классе. Ниже переменной программы 'Длина' изменяется как '' постоянной переменной.

struct Rectangle { let length: Double? init(frombreadth breadth: Double) { length = breadth * 10 } init(frombre bre: Double) { length = bre * 30 } init(_ area: Double) { length = area } } let rectarea = Rectangle(180.0) println("area is: \(rectarea.length)") let rearea = Rectangle(370.0) println("area is: \(rearea.length)") let recarea = Rectangle(110.0) println("area is: \(recarea.length)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

area is: Optional(180.0) area is: Optional(370.0) area is: Optional(110.0)

По умолчанию Инициализаторы

По умолчанию Инициализаторы обеспечивают новый экземпляр ко всем заявленным свойствам базового класса или структуры со значениями по умолчанию.

class defaultexample { var studname: String? var stmark = 98 var pass = true } var result = defaultexample() println("result is: \(result.studname)") println("result is: \(result.stmark)") println("result is: \(result.pass)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

result is: nil result is: 98 result is: true

Вышеприведенная программа определяется с именем класса, как "defaultexample". Три функции-члены инициализируются по умолчанию как "studname? хранить 'ноль' значения, '' stmark как 98 и 'проход' как Логическое значение «истина». Точно так же значения членов в классе могут быть инициализированы по умолчанию перед обработкой типов членов класса.

Почленно Инициализаторы для структурных типов

Когда пользовательские Инициализаторы не предоставляются пользователем, Структурные типы в Swift будет автоматически получать 'почленно инициализатор'. Его основная функция заключается, чтобы инициализировать новые экземпляры структуры с почленно по умолчанию инициализации, а затем новые свойства экземпляра передаются почленно инициализации по имени.

struct Rectangle { var length = 100.0, breadth = 200.0 } let area = Rectangle(length: 24.0, breadth: 32.0) println("Area of rectangle is: \(area.length)") println("Area of rectangle is: \(area.breadth)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Area of rectangle is: 24.0 Area of rectangle is: 32.0

Структуры инициализируются по умолчанию для их функций принадлежности во время инициализации для "длины", как "100.0" и "вширь", как "200.0". Но значения будут перезаписаны при обработке длины переменных и широту как 24,0 и 32,0.

Initializer делегирования для типов значений

Initializer Делегация определяется как вызов инициализаторы из других инициализаторах. Его основная функция должна действовать как повторное использование, чтобы избежать дублирования кода через несколько инициализаторах.

struct Stmark { var mark1 = 0.0, mark2 = 0.0 } struct stdb { var m1 = 0.0, m2 = 0.0 } struct block { var average = stdb() var result = Stmark() init() {} init(average: stdb, result: Stmark) { self.average = average self.result = result } init(avg: stdb, result: Stmark) { let tot = avg.m1 - (result.mark1 / 2) let tot1 = avg.m2 - (result.mark2 / 2) self.init(average: stdb(m1: tot, m2: tot1), result: result) } } let set1 = block() println("student result is: \(set1.average.m1, set1.average.m2) \(set1.result.mark1, set1.result.mark2)") let set2 = block(average: stdb(m1: 2.0, m2: 2.0), result: Stmark(mark1: 5.0, mark2: 5.0)) println("student result is: \(set2.average.m1, set2.average.m2) \(set2.result.mark1, set2.result.mark2)") let set3 = block(avg: stdb(m1: 4.0, m2: 4.0), result: Stmark(mark1: 3.0, mark2: 3.0)) println("student result is: \(set3.average.m1, set3.average.m2) \(set3.result.mark1, set3.result.mark2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

student result is: (0.0, 0.0) (0.0, 0.0) student result is: (2.0, 2.0) (5.0, 5.0) student result is: (2.5, 2.5) (3.0, 3.0)

Правила для Initializer делегации

Типы значений Типы классов
Наследование не поддерживается для типов значений, как структур и перечислений. Что касается других инициализаторы осуществляется через self.init. Наследование поддерживается. Проверяет все сохраненные значения свойств инициализации.

Наследование классов и инициализация

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

Назначенные Инициализаторы и удобство Инициализаторы

Места для Initializer Удобство Initializer
Рассмотренный в качестве первичных инициализирует для класса. Рассмотренный как поддержку инициализации для класса.
Все свойства класса инициализируются и соответствующие суперкласс инициализатор называются для дальнейшей инициализации. Места инициализатор называется с удобством инициализаторе, чтобы создать экземпляр класса для конкретного случая использования или значения входного типа.
По крайней мере, один назначенный инициализатор определяется для каждого класса. Нет необходимости иметь удобства инициализаторах обязательным определяется, когда класс не требует инициализаторы.
Init (параметры) {операторы} удобство инициализации (параметры) {операторы}

Программа для назначенных инициализаторах

class mainClass { var no1 : Int // local storage init(no1 : Int) { self.no1 = no1 // initialization } } class subClass : mainClass { var no2 : Int // new subclass storage init(no1 : Int, no2 : Int) { self.no2 = no2 // initialization super.init(no1:no1) // redirect to superclass } } let res = mainClass(no1: 10) let print = subClass(no1: 10, no2: 20) println("res is: \(res.no1)") println("res is: \(print.no1)") println("res is: \(print.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

res is: 10 res is: 10 res is: 20

Программа для удобства инициализаторах

class mainClass { var no1 : Int // local storage init(no1 : Int) { self.no1 = no1 // initialization } } class subClass : mainClass { var no2 : Int init(no1 : Int, no2 : Int) { self.no2 = no2 super.init(no1:no1) } // Requires only one parameter for convenient method override convenience init(no1: Int) { self.init(no1:no1, no2:0) } } let res = mainClass(no1: 20) let print = subClass(no1: 30, no2: 50) println("res is: \(res.no1)") println("res is: \(print.no1)") println("res is: \(print.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

res is: 20 res is: 30 res is: 50

Initializer Наследование и переопределение

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

Когда пользователь должен иметь инициализаторы, определенные в суперкласса, подкласс с инициализаторах должен быть определен пользователем в качестве пользовательской реализации. Когда переопределение должно быть принято место по классу к югу "Перекрыть" ключевое слово супер класс должен быть объявлен.

class sides { var corners = 4 var description: String { return "\(corners) sides" } } let rectangle = sides() println("Rectangle: \(rectangle.description)") class pentagon: sides { override init() { super.init() corners = 5 } } let bicycle = pentagon() println("Pentagon: \(bicycle.description)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Rectangle: 4 sides Pentagon: 5 sides

Места и удобство Инициализаторы в действии

class Planet { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[No Planets]") } } let plName = Planet(name: "Mercury") println("Planet name is: \(plName.name)") let noplName = Planet() println("No Planets like that: \(noplName.name)") class planets: Planet { var count: Int init(name: String, count: Int) { self.count = count super.init(name: name) } override convenience init(name: String) { self.init(name: name, count: 1) } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Planet name is: Mercury No Planets like that: [No Planets]

Failable Initializer

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

  • Недопустимые значения параметров.
  • Отсутствие требуемого внешнего источника.
  • Состояние предотвращения инициализации от успеха.

Для того, чтобы перехватывать исключения методом инициализации, быстры производит гибкую Initialize под названием 'failable инициализатор', чтобы уведомить пользователя о том, что что-то осталось незамеченным во время инициализации членов структуры, класса или перечисления. Ключевое слово, чтобы поймать failable инициализатор 'инициализировать?'. Кроме того, failable и не являющиеся failable Инициализаторы не может быть определена с теми же типами параметров и именами.

struct studrecord { let stname: String init?(stname: String) { if stname.isEmpty {return nil } self.stname = stname } } let stmark = studrecord(stname: "Swing") if let name = stmark { println("Student name is specified") } let blankname = studrecord(stname: "") if blankname == nil { println("Student name is left blank") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Student name is specified Student name is left blank

Failable Инициализаторы для перечислений

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

enum functions { case a, b, c, d init?(funct: String) { switch funct { case "one": self = .a case "two": self = .b case "three": self = .c case "four": self = .d default: return nil } } } let result = functions(funct: "two") if result != nil { println("With In Block Two") } let badresult = functions(funct: "five") if badresult == nil { println("Block Does Not Exist") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

With In Block Two Block Does Not Exist

Failable Инициализаторы для классов

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

class studrecord { let studname: String! init?(studname: String) { self.studname = studname if studname.isEmpty { return nil } } } if let stname = studrecord(studname: "Failable Initializers") { println("Module is \(stname.studname)") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Module is Failable Initializers

Переопределение Failable Initializer

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

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

Не-failable инициализатор никогда не может делегировать failable инициализаторе.

Программа приводится ниже описывает failable и не failable инициализаторы.

class Planet { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[No Planets]") } } let plName = Planet(name: "Mercury") println("Planet name is: \(plName.name)") let noplName = Planet() println("No Planets like that: \(noplName.name)") class planets: Planet { var count: Int init(name: String, count: Int) { self.count = count super.init(name: name) } override convenience init(name: String) { self.init(name: name, count: 1) } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Planet name is: Mercury No Planets like that: [No Planets]

Init! Failable Initializer

Swift обеспечивает "Init? чтобы определить дополнительный экземпляр failable инициализатор. Для определения неявно развернутую дополнительный экземпляр определенного типа 'INIT! указывается.

struct studrecord { let stname: String init!(stname: String) { if stname.isEmpty {return nil } self.stname = stname } } let stmark = studrecord(stname: "Swing") if let name = stmark { println("Student name is specified") } let blankname = studrecord(stname: "") if blankname == nil { println("Student name is left blank") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Student name is specified Student name is left blank

Обязательно Инициализаторы

Для того, чтобы объявить каждый и каждый подкласс Initialize 'требуется' ключевое слово должно быть определено перед функцией Init ().

class classA { required init() { var a = 10 println(a) } } class classB: classA { required init() { var b = 30 println(b) } } let res = classA() let print = classB()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

10 30 10

Перед тем, как экземпляр класса должен быть высвобождены 'deinitializer' должен быть призван освободить пространство памяти. Ключевое слово 'Deinit' используется для освобождения пространства памяти, занимаемый системой ресурсов. Деинициализация доступен только по типам классов.

Деинициализация в DEALLOCATE пространство памяти

Swift автоматически освобождает ваши случаи, когда они не будут больше не нужны, чтобы освободить ресурсы. Swift обрабатывает управление памятью экземпляров с помощью автоматического подсчета ссылок (ARC), как описано в разделе Автоматическая подсчетом ссылок. Как правило, вам не нужно выполнять ручную очистку, когда ваши экземпляры высвобождены. Тем не менее, когда вы работаете с вашими собственными ресурсами, возможно, потребуется выполнить некоторые дополнительные Clean-Up самостоятельно. Например, если вы создаете пользовательский класс, чтобы открыть файл и запись данных в ней, возможно, придется закрыть файл перед экземпляра класса высвобождены.

var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() println(counter) print = nil println(counter)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

1 0

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

var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() println(counter) println(counter)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

1 1

Функции управления памятью и ее использование обрабатываются в Swift языке с помощью автоматического подсчета ссылок (ARC). ARC не используется для инициализации и деинициализации системные ресурсы, тем самым освобождая пространство памяти, используемые экземпляры классов, когда экземпляры больше не нужны. ARC отслеживает информацию о взаимоотношениях между нашими экземплярами кода, чтобы эффективно управлять ресурсами памяти.

Функции ARC

  • ARC выделяет блок памяти для хранения информации, каждый раз, когда создается новый экземпляр класса создается Init ().

  • Информация о типе экземпляра и его значения сохраняются в памяти.

  • Когда экземпляр класса больше не нужен он автоматически освобождает место в памяти с помощью Deinit () для дальнейшего хранения и поиска экземпляра класса.

  • ARC держит в треке в настоящее время в виду экземпляры классов свойств, константы и переменные так, что Deinit () применяется только к незанятых экземпляров.

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

ARC Программа

class StudDetails { var stname: String! var mark1: Int! init(stname: String, mark1: Int) { self.stname = stname self.mark1 = mark1 } deinit { println("Deinitialized \(self.stname)") println("Deinitialized \(self.mark1)") } } let stname = "swift" let mark1 = 98 println(stname) println(mark1)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

swift 98

ARC Strong ссылочных экземпляров класса Циклы

class studmarks { let name: String var stud1: student? init (name: String) { println("Initializing: \(name)") self.name = name } deinit { println("Deallocating: \(self.name)") } } class student { let name: String var strname: studmarks? init (name: String) { println("Initializing: \(name)") self.name = name } deinit { println("Deallocating: \(self.name)") } } var shiba: studmarks? var mari: student? shiba = studmarks(name: "Swift") mari = student(name: "ARC") shiba!.stud1 = mari mari!.strname = shiba

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Initializing: Swift Initializing: ARC

ARC Слабые и без владельца Ссылки

Свойства типа класса имеет два пути решения сильных опорных циклов -

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

Слабая ссылка Программа

class module { let name: String init(name: String) { self.name = name } var sub: submodule? deinit { println("\(name) Is The Main Module") } } class submodule { let number: Int init(number: Int) { self.number = number } weak var topic: module? deinit { println("Sub Module with its topic number is \(number)") } } var toc: module? var list: submodule? toc = module(name: "ARC") list = submodule(number: 4) toc!.sub = list list!.topic = toc toc = nil list = nil

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

ARC Is The Main Module Sub Module with its topic number is 4

Бесхозный Справочная программа

class student { let name: String var section: marks? init(name: String) { self.name = name } deinit { println("\(name)") } } class marks { let marks: Int unowned let stname: student init(marks: Int, stname: student) { self.marks = marks self.stname = stname } deinit { println("Marks Obtained by the student is \(marks)") } } var module: student? module = student(name: "ARC") module!.section = marks(marks: 98, stname: module!) module = nil

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

ARC Marks Obtained by the student is 98

Сильные справочники Циклы для затворов

Когда мы относим укупорочное к свойству экземпляра класса и к корпусу укупорочного средства, чтобы захватить конкретный экземпляр сильный опорный цикл может произойти. Сильная ссылка на закрытие определяется 'self.someProperty' или 'self.someMethod ()'. Сильные опорные циклы используются в качестве эталонных типов для замыканий.

class HTMLElement { let samplename: String let text: String? lazy var asHTML: () -> String = { if let text = self.text { return "<\(self.samplename)>\(text)</\(self.samplename)>" }else { return "<\(self.samplename) />" } } init(samplename: String, text: String? = nil) { self.samplename = samplename self.text = text } deinit { println("\(samplename) is being deinitialized") } } var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC") println(paragraph!.asHTML())

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

<p>Welcome to Closure SRC</p>

Слабые и без владельца Ссылки

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

class HTMLElement { let module: String let text: String? lazy var asHTML: () -> String = { [unowned self] in if let text = self.text { return "<\(self.module)>\(text)</\(self.module)>" }else { return "<\(self.module) />" } } init(module: String, text: String? = nil) { self.module = module self.text = text } deinit { println("\(module) the deinit()") } } var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References") println(paragraph!.asHTML()) paragraph = nil

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

<Inside>ARC Weak References</Inside> Inside the deinit()

Процесс выполнения запросов, вызывая свойства, нижние индексы и методы на факультативной, который может быть 'ноль' определяется в качестве дополнительного логического вывода. Дополнительно возврата сцепления два значения -

  • если опция содержит значение '', а затем вызвав связанных свойств, методов и индексов возвращает значения.

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

Так как несколько запросов к методам, свойствам и индексы сгруппированы отказ одной цепи будет влиять на всю цепочку и результаты в значение 'ноль'.

Дополнительный Chaining как альтернатива форсированного разворачивания

Дополнительное сцепление задается после необязательного значения с '?' вызвать свойство, метод или нижний индекс, когда факультативное значение возвращает несколько значений.

Необязательный Chaining '?' Доступ к методам, свойствам и subscriptsOptional Chaining '!' чтобы заставить разворачивания
? помещается после необязательного значения для вызова свойств, метод или нижний индекс ! помещается после необязательного значения для вызова свойств, метод или индекс, чтобы заставить разворачивания значения
Не удается изящно, когда опционально 'ноль' Принудительный разворачивание вызывает ошибку во время выполнения, когда опционально 'ноль'

Программа для опционного Цепной с '!'

class ElectionPoll { var candidate: Pollbooth? } class Pollbooth { var name = "MP" } let cand = ElectionPoll() let candname = cand.candidate!.name

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

fatal error: unexpectedly found nil while unwrapping an Optional value 0 swift 0x0000000103410b68 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x0000000103411054 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff9176af1a _sigtramp + 26 3 libsystem_platform.dylib 0x000000000000000b _sigtramp + 1854492939 4 libsystem_platform.dylib 0x00000001074a0214 _sigtramp + 1976783636 5 swift 0x0000000102a85c39 llvm::JIT::runFunction(llvm::Function*, std::__1::vector<llvm::GenericValue, std::__1::allocator<llvm::GenericValue> > const&) + 329 6 swift 0x0000000102d320b3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 1523 7 swift 0x000000010296e6ba swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 1066 8 swift 0x000000010275764b frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 5275 9 swift 0x0000000102754a6d main + 1677 10 libdyld.dylib 0x00007fff8bb9e5c9 start + 1 11 libdyld.dylib 0x000000000000000c start + 1950751300 Stack dump: 0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret - -target x86_64-apple-darwin14.0.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -module-name main /bin/sh: line 47: 15672 Done cat <<'SWIFT' import Foundation

Вышеприведенная программа объявляет "избирательный опрос" в качестве имени класса и содержит "кандидат" в качестве функции принадлежности. Подкласс объявляется как «опрос будке» и «имя» в качестве своей функции принадлежности, которая инициализируется как "МП". Вызов суперкласса инициализируется путем создания экземпляра 'CAND' с дополнительным '!'. Поскольку значения не объявляются в базовом классе, 'ноль' значение сохраняется, таким образом, возвращая фатальную ошибку силой процедуру разворачивания.

Программа для опционного Цепной с '?'

class ElectionPoll { var candidate: Pollbooth? } class Pollbooth { var name = "MP" } let cand = ElectionPoll() if let candname = cand.candidate?.name { println("Candidate name is \(candname)") }else { println("Candidate name cannot be retreived") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Candidate name cannot be retreived

Программа выше объявляет "избирательный опрос" в качестве имени класса и содержит "кандидат" в качестве функции принадлежности. Подкласс объявляется как «опрос будке» и «имя» в качестве своей функции принадлежности, которая инициализируется как "МП". Вызов суперкласса инициализируется путем создания экземпляра 'CAND' с дополнительным '?'. Поскольку значения не объявляются в базовом классе 'ноль' значение сохраняется и печатается в консоли с помощью блока обработчика еще.

Определение Классы моделей для опций Chaining и доступа к свойствам

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

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var street: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let rectname = rectangle() if let rectarea = rectname.print?.cprint { println("Area of rectangle is \(rectarea)") } else { println("Rectangle Area is not specified") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Rectangle Area is not specified

Вызов методов с помощью дополнительных Chaining

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("Area of Circle is: \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() if circname.print?.circleprint() != nil { println("Area of circle is specified)") } else { println("Area of circle is not specified") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Area of circle is not specified

Функция circleprint () объявлена ​​внутри класса к югу от круга () вызывается путем создания экземпляра с именем 'circname'. Функция возвращает значение, если он содержит некоторое значение в противном случае он будет возвращать некоторые определенные пользователем сообщение печати, проверив заявление ", если circname.print? .circleprint ()! = Ноль '.

Доступ к подстрочные через Факультативный Chaining

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

Программа 1

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() if let radiusName = circname.print?[0].radiusname { println("The first room name is \(radiusName).") } else { println("Radius is not specified.") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius is not specified.

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

Программа 2

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() circname.print?[0] = radius(radiusname: "Diameter") let printing = circle() printing.area.append(radius(radiusname: "Units")) printing.area.append(radius(radiusname: "Meter")) circname.print = printing if let radiusName = circname.print?[0].radiusname { println("Radius is measured in \(radiusName).") }else { println("Radius is not specified.") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius is measured in Units.

В приведенной выше программе, значения экземпляра для функции членства 'radiusName' указывается. Поэтому программа вызов функции теперь будет возвращать значения.

Доступ к Факультативному Индексы типа

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() circname.print?[0] = radius(radiusname: "Diameter") let printing = circle() printing.area.append(radius(radiusname: "Units")) printing.area.append(radius(radiusname: "Meter")) circname.print = printing var area = ["Radius": [35, 45, 78, 101], "Circle": [90, 45, 56]] area["Radius"]?[1] = 78 area["Circle"]?[1]-- println(area["Radius"]?[0]) println(area["Radius"]?[1]) println(area["Radius"]?[2]) println(area["Radius"]?[3]) println(area["Circle"]?[0]) println(area["Circle"]?[1]) println(area["Circle"]?[2])

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Optional(35) Optional(78) Optional(78) Optional(101) Optional(90) Optional(44) Optional(56)

Необязательные значения индексов можно получить, обратившись их значения индекса. Это могут быть доступны как нижний индекс [0], нижний индекс [1] и т.д. Значения подстрочные по умолчанию для 'радиуса' сначала назначенная как [35, 45, 78, 101] и 'Circle' [90, 45, 56]] , Тогда индексные значения изменяются, как радиус [0] до 78 и Circle [1] до 45.

Связывание нескольких уровней Цепной

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

Множественный цепочки факультативных могут быть связаны -

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

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() if let radiusName = circname.print?[0].radiusname { println("The first room name is \(radiusName).") }else { println("Radius is not specified.") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius is not specified.

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

Если тип уже при получении по желанию, а затем по желанию сцепление будет также возвращать дополнительную ценность. Например, если строка? Доступ через опциональный цепочки он будет возвращать строку? Стоимость.

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("The number of rooms is \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() circname.print?[0] = radius(radiusname: "Diameter") let printing = circle() printing.area.append(radius(radiusname: "Units")) printing.area.append(radius(radiusname: "Meter")) circname.print = printing if let radiusName = circname.print?[0].radiusname { println("Radius is measured in \(radiusName).") }else { println("Radius is not specified.") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Radius is measured in Units.

В приведенной выше программе, значения экземпляра для функции членства 'radiusName' указывается. Таким образом, вызов программы к функции теперь будет возвращать значения.

Цепной по методам с факультативным Возвращаемые значения

Дополнительное сцепление используется для подклассов доступа определенных методов тоже.

class rectangle { var print: circle? } class circle { var area = [radius]() var cprint: Int { return area.count } subscript(i: Int) -> radius { get { return area[i] }set { area[i] = newValue } } func circleprint() { println("Area of Circle is: \(cprint)") } var rectarea: circumference? } class radius { let radiusname: String init(radiusname: String) { self.radiusname = radiusname } } class circumference { var circumName: String? var circumNumber: String? var circumarea: String? func buildingIdentifier() -> String? { if circumName != nil { return circumName }else if circumNumber != nil { return circumNumber }else { return nil } } } let circname = rectangle() if circname.print?.circleprint() != nil { println("Area of circle is specified)") }else { println("Area of circle is not specified") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Area of circle is not specified

Чтобы проверить тип экземпляра "Тип Кастинг" вступает в игру в Swift языке. Он используется для проверки того, принадлежит ли тип экземпляра к конкретному супер класса или подкласса, или оно определено в своей собственной иерархии.

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

Определение иерархии классов

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

class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "solid physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")] let samplechem = Chemistry(physics: "solid physics", equations: "Hertz") println("Instance physics is: \(samplechem.physics)") println("Instance equation is: \(samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") println("Instance physics is: \(samplemaths.physics)") println("Instance formulae is: \(samplemaths.formulae)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Instance physics is: solid physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz

Тип Поверки

Проверка типов осуществляется с '' является оператором. "Есть" типа проверки проверки оператора принадлежит ли экземпляр к определенному типу подкласса и возвращает "истина", если он принадлежит к этому экземпляру иначе она будет возвращать 'ложь'.

class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "solid physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "solid physics", equations: "Hertz") println("Instance physics is: \(samplechem.physics)") println("Instance equation is: \(samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") println("Instance physics is: \(samplemaths.physics)") println("Instance formulae is: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if item is Chemistry { ++chemCount }else if item is Maths { ++mathsCount } } println("Subjects in chemistry contains \(chemCount) topics and maths contains \(mathsCount) topics")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Instance physics is: solid physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Subjects in chemistry contains 2 topics and maths contains 3 topics

понижающее приведение

Понижающее приведение типа подкласса можно сделать с помощью двух операторов (как это? А как же!). "Как?" возвращает необязательное значение, когда значение возвращается к нулю. Он используется для проверки успешного опущенными.

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

class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "solid physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "solid physics", equations: "Hertz") println("Instance physics is: \(samplechem.physics)") println("Instance equation is: \(samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") println("Instance physics is: \(samplemaths.physics)") println("Instance formulae is: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if let print = item as? Chemistry { println("Chemistry topics are: '\(print.physics)', \(print.equations)") }else if let example = item as? Maths { println("Maths topics are: '\(example.physics)', \(example.formulae)") } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Instance physics is: solid physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: 'solid physics', Hertz Maths topics are: 'Fluid Dynamics', Giga Hertz Chemistry topics are: 'Thermo physics', Decibels Maths topics are: 'Astro Physics', MegaHertz Maths topics are: 'Differential Equations', Cosine Series

Приведение типов: Любой и Любой объект

Ключевое слово 'Any' используется для представления экземпляра, который принадлежит к любому типу, включая типы функций.

class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let sa = [ Chemistry(physics: "solid physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "solid physics", equations: "Hertz") println("Instance physics is: \(samplechem.physics)") println("Instance equation is: \(samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") println("Instance physics is: \(samplemaths.physics)") println("Instance formulae is: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { if let print = item as? Chemistry { println("Chemistry topics are: '\(print.physics)', \(print.equations)") }else if let example = item as? Maths { println("Maths topics are: '\(example.physics)', \(example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Example for Any") exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz")) for print in exampleany { switch print { case let someInt as Int: println("Integer value is \(someInt)") case let someDouble as Double where someDouble > 0: println("Pi value is \(someDouble)") case let someString as String: println("\(someString)") case let phy as Chemistry: println("Topics '\(phy.physics)', \(phy.equations)") default: println("None") } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Instance physics is: solid physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: 'solid physics', Hertz Maths topics are: 'Fluid Dynamics', Giga Hertz Chemistry topics are: 'Thermo physics', Decibels Maths topics are: 'Astro Physics', MegaHertz Maths topics are: 'Differential Equations', Cosine Series Integer value is 12 Pi value is 3.14159 Example for Any Topics 'solid physics', Hertz

AnyObject

Для того, чтобы представить экземпляр любого типа класса, используется ключевое слово 'AnyObject'.

class Subjects { var physics: String init(physics: String) { self.physics = physics } } class Chemistry: Subjects { var equations: String init(physics: String, equations: String) { self.equations = equations super.init(physics: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) } } let saprint: [AnyObject] = [Chemistry(physics: "solid physics", equations: "Hertz"), Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"), Chemistry(physics: "Thermo physics", equations: "Decibels"), Maths(physics: "Astro Physics", formulae: "MegaHertz"), Maths(physics: "Differential Equations", formulae: "Cosine Series")] let samplechem = Chemistry(physics: "solid physics", equations: "Hertz") println("Instance physics is: \(samplechem.physics)") println("Instance equation is: \(samplechem.equations)") let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz") println("Instance physics is: \(samplemaths.physics)") println("Instance formulae is: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in saprint { if let print = item as? Chemistry { println("Chemistry topics are: '\(print.physics)', \(print.equations)") }else if let example = item as? Maths { println("Maths topics are: '\(example.physics)', \(example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Example for Any") exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz")) for print in exampleany { switch print { case let someInt as Int: println("Integer value is \(someInt)") case let someDouble as Double where someDouble > 0: println("Pi value is \(someDouble)") case let someString as String: println("\(someString)") case let phy as Chemistry: println("Topics '\(phy.physics)', \(phy.equations)") default: println("None") } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Instance physics is: solid physics Instance equation is: Hertz Instance physics is: Fluid Dynamics Instance formulae is: Giga Hertz Chemistry topics are: 'solid physics', Hertz Maths topics are: 'Fluid Dynamics', Giga Hertz Chemistry topics are: 'Thermo physics', Decibels Maths topics are: 'Astro Physics', MegaHertz Maths topics are: 'Differential Equations', Cosine Series Integer value is 12 Pi value is 3.14159 Example for Any Topics 'solid physics', Hertz

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

Swift Extension - Функциональности

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

Расширения объявляются с помощью ключевого слова 'расширение'.

Синтаксис

extension SomeType { // new functionality can be added here }

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

extension SomeType: SomeProtocol, AnotherProtocol { // protocol requirements is described here }

Рассчитанные Свойства

Компьютерный 'экземпляр' и свойства 'тип' также может быть расширена с помощью расширений.

extension Int { var add: Int {return self + 100 } var sub: Int { return self - 10 } var mul: Int { return self * 10 } var div: Int { return self / 5 } } let addition = 3.add println("Addition is \(addition)") let subtraction = 120.sub println("Subtraction is \(subtraction)") let multiplication = 39.mul println("Multiplication is \(multiplication)") let division = 55.div println("Division is \(division)") let mix = 30.add + 34.sub println("Mixed Type is \(mix)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Addition is 103 Subtraction is 110 Multiplication is 390 Division is 11 Mixed Type is 154

Инициализаторы

Swift обеспечивает гибкость при добавлении новых инициализаторы к существующему типу с помощью расширений. Пользователь может добавлять свои собственные типы, чтобы расширить типы уже определены и дополнительные параметры инициализации также возможны. Расширения поддерживает только Init (). Deinit () не поддерживается расширениями.

struct sum { var num1 = 100, num2 = 200 } struct diff { var no1 = 200, no2 = 100 } struct mult { var a = sum() var b = diff() } let calc = mult() println ("Inside mult block \(calc.a.num1, calc.a.num2)") println("Inside mult block \(calc.b.no1, calc.b.no2)") let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100)) println("Inside mult block \(memcalc.a.num1, memcalc.a.num2)") println("Inside mult block \(memcalc.b.no1, memcalc.b.no2)") extension mult { init(x: sum, y: diff) { let X = x.num1 + x.num2 let Y = y.no1 + y.no2 } } let a = sum(num1: 100, num2: 200) println("Inside Sum Block:\( a.num1, a.num2)") let b = diff(no1: 200, no2: 100) println("Inside Diff Block: \(b.no1, b.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Inside mult block (100, 200) Inside mult block (200, 100) Inside mult block (300, 500) Inside mult block (300, 100) Inside Sum Block:(100, 200) Inside Diff Block: (200, 100)

методы

Новые методы экземпляра и методы типа могут быть добавлены в дополнение к подклассу с помощью расширений.

extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ println("Inside Extensions Block") }) 3.topics({ println("Inside Type Casting Block") })

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Inside Extensions Block Inside Extensions Block Inside Extensions Block Inside Extensions Block Inside Type Casting Block Inside Type Casting Block Inside Type Casting Block

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

Мутирует Методы экземпляра

Методы экземпляра могут быть также мутировали при объявлении в качестве расширений.

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

extension Double { mutating func square() { let pi = 3.1415 self = pi * self * self } } var Trial1 = 3.3 Trial1.square() println("Area of circle is: \(Trial1)") var Trial2 = 5.8 Trial2.square() println("Area of circle is: \(Trial2)") var Trial3 = 120.3 Trial3.square() println("Area of circle is: \(Trial3)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Area of circle is: 34.210935 Area of circle is: 105.68006 Area of circle is: 45464.070735

Нижние индексы

Добавление новых индексов в уже объявленные экземпляры могут быть также возможно с расширениями.

extension Int { subscript(var multtable: Int) -> Int { var no1 = 1 while multtable > 0 { no1 *= 10 --multtable } return (self / no1) % 10 } } println(12[0]) println(7869[1]) println(786543[2])

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

2 6 5

Вложенные типы

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

extension Int { enum calc { case add case sub case mult case div case anything } var print: calc { switch self { case 0: return .add case 1: return .sub case 2: return .mult case 3: return .div default: return .anything } } } func result(numb: [Int]) { for i in numb { switch i.print { case .add: println(" 10 ") case .sub: println(" 20 ") case .mult: println(" 30 ") case .div: println(" 40 ") default: println(" 50 ") } } } result([0, 1, 2, 3, 4, 7])

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

10 20 30 40 50 50

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

Синтаксис

Протоколы также следуют подобный синтаксис, что и классов, структур и перечислений -

protocol SomeProtocol { // protocol definition }

Протоколы объявлены после имен классов, структуры или типа перечисления. Одиночные и множественные описания протокола также возможны. Если несколько протоколов определены они должны быть разделены запятыми.

struct SomeStructure: Protocol1, Protocol2 { // structure definition }

Когда протокол должен быть определен для супер класса, имя протокола должно следовать имя суперкласса с запятой.

class SomeClass: SomeSuperclass, Protocol1, Protocol2 { // class definition }

Свойств и методов Требования

Протокол используется для указания конкретного типа класса свойство или экземпляра свойства. Он просто указывает тип или экземпляр свойства в одиночку, а не указывать, является ли она хранится или вычисляется свойство. Кроме того, он используется, чтобы определить, является ли свойство является "GetTable" или "устанавливаемое".

Требования к собственности объявляются "Var" ключевое слово в качестве переменных свойств. {} Получить набор используется для объявления GetTable и отверждаемые свойства после их объявления типа. GetTable упоминается {} GET имущества после их объявления типа.

protocol classa { var marks: Int { get set } var result: Bool { get } func attendance() -> String func markssecured() -> String } protocol classb: classa { var present: Bool { get set } var subject: String { get set } var stname: String { get set } } class classc: classb { var marks = 96 let result = true var present = false var subject = "Swift Protocols" var stname = "Protocols" func attendance() -> String { return "The \(stname) has secured 99% attendance" } func markssecured() -> String { return "\(stname) has scored \(marks)" } } let studdet = classc() studdet.stname = "Swift" studdet.marks = 98 studdet.markssecured() println(studdet.marks) println(studdet.result) println(studdet.present) println(studdet.subject) println(studdet.stname)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

98 true false Swift Protocols Swift

Mutating Метод Требования

protocol daysofaweek { mutating func print() } enum days: daysofaweek { case sun, mon, tue, wed, thurs, fri, sat mutating func print() { switch self { case sun: self = sun println("Sunday") case mon: self = mon println("Monday") case tue: self = tue println("Tuesday") case wed: self = wed println("Wednesday") case mon: self = thurs println("Thursday") case tue: self = fri println("Friday") case sat: self = sat println("Saturday") default: println("NO Such Day") } } } var res = days.wed res.print()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Wednesday

Initializer Требования

Качели позволяет пользователю инициализировать протоколы следовать типа соответствия, аналогичную нормальных инициализаторах.

Синтаксис

protocol SomeProtocol { init(someParameter: Int) }

Например

protocol tcpprotocol { init(aprot: Int) }

Класс Реализации протокола Initializer Требования

Определенное место или удобство инициализатор позволяет пользователю инициализировать протокол, чтобы соответствовать его стандартам зарезервированным 'требуется' ключевое слово.

class SomeClass: SomeProtocol { required init(someParameter: Int) { // initializer implementation statements } } protocol tcpprotocol { init(aprot: Int) } class tcpClass: tcpprotocol { required init(aprot: Int) {} }

Протокол соответствия обеспечивается на всех подклассов для явного или унаследованного осуществлении '' требуемого модификатора.

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

protocol tcpprotocol { init(no1: Int) } class mainClass { var no1: Int // local storage init(no1: Int) { self.no1 = no1 // initialization } } class subClass: mainClass, tcpprotocol { var no2: Int init(no1: Int, no2 : Int) { self.no2 = no2 super.init(no1:no1) } // Requires only one parameter for convenient method required override convenience init(no1: Int) { self.init(no1:no1, no2:0) } } let res = mainClass(no1: 20) let print = subClass(no1: 30, no2: 50) println("res is: \(res.no1)") println("res is: \(print.no1)") println("res is: \(print.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

res is: 20 res is: 30 res is: 50

Протоколы как типы

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

Протоколы могут быть доступны как в типах -

  • Функция, метод или инициализации в качестве параметра или тип возвращаемого значения.
  • Константа, переменная или свойство.
  • Массивы, словари или другие контейнеры как элементы.
protocol Generator { typealias members func next() -> members? } var items = [10,20,30].generate() while let x = items.next() { println(x) } for lists in map([1,2,3], {i in i*5}) { println(lists) } println([100,200,300]) println(map([1,2,3], {i in i*10}))

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

10 20 30 5 10 15 [100, 200, 300] [10, 20, 30]

Добавление протокола Conformance с расширением

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

protocol AgeClasificationProtocol { var age: Int { get } func agetype() -> String } class Person { let firstname: String let lastname: String var age: Int init(firstname: String, lastname: String) { self.firstname = firstname self.lastname = lastname self.age = 10 } } extension Person : AgeClasificationProtocol { func fullname() -> String { var c: String c = firstname + " " + lastname return c } func agetype() -> String { switch age { case 0...2: return "Baby" case 2...12: return "Child" case 13...19: return "Teenager" case let x where x > 65: return "Elderly" default: return "Normal" } } }

Протокол наследования

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

protocol classa { var no1: Int { get set } func calc(sum: Int) } protocol result { func print(target: classa) } class student2: result { func print(target: classa) { target.calc(1) } } class classb: result { func print(target: classa) { target.calc(5) } } class student: classa { var no1: Int = 10 func calc(sum: Int) { no1 -= sum println("Student attempted \(sum) times to pass") if no1 <= 0 { println("Student is absent for exam") } } } class Player { var stmark: result! init(stmark: result) { self.stmark = stmark } func print(target: classa) { stmark.print(target) } } var marks = Player(stmark: student2()) var marksec = student() marks.print(marksec) marks.print(marksec) marks.print(marksec) marks.stmark = classb() marks.print(marksec) marks.print(marksec) marks.print(marksec)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Student attempted 1 times to pass Student attempted 1 times to pass Student attempted 1 times to pass Student attempted 5 times to pass Student attempted 5 times to pass Student is absent for exam Student attempted 5 times to pass Student is absent for exam

Класс только протоколы

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

protocol tcpprotocol { init(no1: Int) } class mainClass { var no1: Int // local storage init(no1: Int) { self.no1 = no1 // initialization } } class subClass: mainClass, tcpprotocol { var no2: Int init(no1: Int, no2 : Int) { self.no2 = no2 super.init(no1:no1) } // Requires only one parameter for convenient method required override convenience init(no1: Int) { self.init(no1:no1, no2:0) } } let res = mainClass(no1: 20) let print = subClass(no1: 30, no2: 50) println("res is: \(res.no1)") println("res is: \(print.no1)") println("res is: \(print.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

res is: 20 res is: 30 res is: 50

Протокол Состав

Swift позволяет использовать несколько протоколов называться сразу с помощью композиции протокола.

Синтаксис

protocol<SomeProtocol, AnotherProtocol>

пример

protocol stname { var name: String { get } } protocol stage { var age: Int { get } } struct Person: stname, stage { var name: String var age: Int } func print(celebrator: protocol<stname, stage>) { println("\(celebrator.name) is \(celebrator.age) years old") } let studname = Person(name: "Priya", age: 21) print(studname) let stud = Person(name: "Rehan", age: 29) print(stud) let student = Person(name: "Roshan", age: 19) print(student)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Priya is 21 years old Rehan is 29 years old Roshan is 19 years old

Проверка соответствия протокола

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

  • Оператор несет возвращает истину, если экземпляр соответствует стандартному протоколу и возвращает ложь, если она выходит из строя.

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

  • , Как версия опущенными оператора заставляет опущенными к типу протокола и вызывает ошибку времени выполнения, если удручен не удастся.

import Foundation @objc protocol rectangle { var area: Double { get } } @objc class Circle: rectangle { let pi = 3.1415927 var radius: Double var area: Double { return pi * radius * radius } init(radius: Double) { self.radius = radius } } @objc class result: rectangle { var area: Double init(area: Double) { self.area = area } } class sides { var rectsides: Int init(rectsides: Int) { self.rectsides = rectsides } } let objects: [AnyObject] = [Circle(radius: 2.0),result(area: 198),sides(rectsides: 4)] for object in objects { if let objectWithArea = object as? rectangle { println("Area is \(objectWithArea.area)") } else { println("Rectangle area is not defined") } }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Area is 12.5663708 Area is 198.0 Rectangle area is not defined

Swift язык предоставляет функции 'Generic' писать гибкие и многократно используемые функции и типы. Дженерики используются, чтобы избежать дублирования и обеспечить абстракции. Swift стандартные библиотеки построены с дженериков кодом. Стрижи "Массивы" и типы «словарь» принадлежат к родовым коллекций. С помощью массивов и словарей массивы определены для хранения значений 'Int' и значения 'строка' или любые другие типы.

func exchange(inout a: Int, inout b: Int) { let temp = a a = b b = temp } var numb1 = 100 var numb2 = 200 println("Before Swapping values are: \(numb1) and \(numb2)") exchange(&numb1, &numb2) println("After Swapping values are: \(numb1) and \(numb2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Before Swapping values are: 100 and 200 After Swapping values are: 200 and 100

Общие функции: Тип Параметры

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

func exchange<T>(inout a: T, inout b: T) { let temp = a a = b b = temp } var numb1 = 100 var numb2 = 200 println("Before Swapping Int values are: \(numb1) and \(numb2)") exchange(&numb1, &numb2) println("After Swapping Int values are: \(numb1) and \(numb2)") var str1 = "Generics" var str2 = "Functions" println("Before Swapping String values are: \(str1) and \(str2)") exchange(&str1, &str2) println("After Swapping String values are: \(str1) and \(str2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Before Swapping Int values are: 100 and 200 After Swapping Int values are: 200 and 100 Before Swapping String values are: Generics and Functions After Swapping String values are: Functions and Generics

Функция обмена данными () используется для замены значений, который описан в приведенной выше программе и <T> используется в качестве параметра типа. Впервые, замена функция () вызывается для возвращения значения 'Int' и второй вызов к функции обмена () будет возвращать значения 'строка'. Несколько типов параметров могут быть включены в угловых скобках через запятую.

Параметры типа называются, как определено знать назначение параметра типа, который он держит пользователь. Swift обеспечивает <T> как родовое название параметра типа. Однако такие параметры, как тип массивы и словари также могут быть названы в качестве ключа, значение для того чтобы определить, что они принадлежат к типу "Словарь".

Общие типы

struct TOS<T> { var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } } var tos = TOS<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Type Parameters") println(tos.items) tos.push("Naming Type Parameters") println(tos.items) let deletetos = tos.pop()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Type Parameters] [Swift, Generics, Type Parameters, Naming Type Parameters]

Расширение универсального типа

Расширение свойство стека знать, в верхней части элемента входит в состав 'расширение' ключевое слово.

struct TOS<T> { var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } } var tos = TOS<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Type Parameters") println(tos.items) tos.push("Naming Type Parameters") println(tos.items) extension TOS { var first: T? { return items.isEmpty ? nil : items[items.count - 1] } } if let first = tos.first { println("The top item on the stack is \(first).") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Type Parameters] [Swift, Generics, Type Parameters, Naming Type Parameters]

Верхний элемент в стеке Присвоение имени Параметры типа.

Тип Ограничения

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

func exchange<T>(inout a: T, inout b: T) { let temp = a a = b b = temp } var numb1 = 100 var numb2 = 200 println("Before Swapping Int values are: \(numb1) and \(numb2)") exchange(&numb1, &numb2) println("After Swapping Int values are: \(numb1) and \(numb2)") var str1 = "Generics" var str2 = "Functions" println("Before Swapping String values are: \(str1) and \(str2)") exchange(&str1, &str2) println("After Swapping String values are: \(str1) and \(str2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Before Swapping Int values are: 100 and 200 After Swapping Int values are: 200 and 100 Before Swapping String values are: Generics and Functions After Swapping String values are: Functions and Generics

Ассоциированные типы

Swift позволяет связанные типы должны быть объявлены внутри определения протокола по ключевому слову "typealias".

protocol Container { typealias ItemType mutating func append(item: ItemType) var count: Int { get } subscript(i: Int) -> ItemType { get } } struct TOS<T>: Container { // original Stack<T> implementation var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } // conformance to the Container protocol mutating func append(item: T) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> T { return items[i] } } var tos = TOS<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Type Parameters") println(tos.items) tos.push("Naming Type Parameters") println(tos.items)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Type Parameters] [Swift, Generics, Type Parameters, Naming Type Parameters]

Где Морозы

Тип ограничения позволяют пользователю определить требования к параметрам типа, связанных с родовой функции или типа. Для определения требований к связанным типам ", где" положения объявлены как часть списка параметров типа. ', Где' ключевое слово помещается сразу после списка параметров типа с последующим ограничениями сопряженных типов, отношений равенства между типами и связанных с ними типов.

protocol Container { typealias ItemType mutating func append(item: ItemType) var count: Int { get } subscript(i: Int) -> ItemType { get } } struct Stack<T>: Container { // original Stack<T> implementation var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } // conformance to the Container protocol mutating func append(item: T) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> T { return items[i] } } func allItemsMatch< C1: Container, C2: Container where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, anotherContainer: C2) -> Bool { // check that both containers contain the same number of items if someContainer.count != anotherContainer.count { return false } // check each pair of items to see if they are equivalent for i in 0..<someContainer.count { if someContainer[i] != anotherContainer[i] { return false } } // all items match, so return true return true } var tos = Stack<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Where Clause") println(tos.items) var eos = ["Swift", "Generics", "Where Clause"] println(eos)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Where Clause] [Swift, Generics, Where Clause]

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

Модель управления доступом основана на модулях и исходных файлов.

Модуль определяется как единый блок распределения кода и могут быть импортированы с помощью ключевого слова 'импорта'. Исходный файл определяется как единый файл исходного кода с в модуле для доступа нескольких типов и функций.

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

S.No Уровни доступа и определения
1

общественного

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

2

внутренний

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

3

Частный

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

Синтаксис

public class SomePublicClass {} internal class SomeInternalClass {} private class SomePrivateClass {} public var somePublicVariable = 0 internal let someInternalConstant = 0 private func somePrivateFunction() {}

Контроль доступа для типов функций

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

private func sum(a: Int, b: Int) { let a = a + b let b = a - b println(a, b) } sum(20, 10) sum(40,10) sum(24,6)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

(30, 20) (50, 40) (30, 24)

Контроль доступа для перечислимых типов

public enum Student { case Name(String) case Mark(Int,Int,Int) } var studDetails = Student.Name("Swift") var studMarks = Student.Mark(98,97,95) switch studMarks { case .Name(let studName): println("Student name is: \(studName).") case .Mark(let Mark1, let Mark2, let Mark3): println("Student Marks are: \(Mark1),\(Mark2),\(Mark3).") default: println("Nothing") }

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Student Marks are: 98,97,95

Перечисление в Swift языке автоматически получать тот же уровень доступа для отдельных случаев перечисления. Рассмотрим, например, чтобы получить доступ к имени студентов и знаки закреплены в трех субъектов имени перечисления объявлен как студент и члены, присутствующие в классе перечислений имя, которое принадлежит к типу данных строки, знаки представлены как mark1, Mark2 и Mark3 типа данных Integer. Чтобы получить доступ либо имя студента или знаки они набрали. Теперь, в случае коммутатор будет печатать имя студента, если в этом случае блок выполняется в противном случае он будет печатать знаки, обеспеченные студента. Если оба условие не выполняется блок по умолчанию будет выполняться.

Контроль доступа для подклассов

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

public class cricket { private func print() { println("Welcome to Swift Super Class") } } internal class tennis: cricket { override internal func print() { println("Welcome to Swift Sub Class") } } let cricinstance = cricket() cricinstance.print() let tennisinstance = tennis() tennisinstance.print()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Welcome to Swift Super Class Welcome to Swift Sub Class

Контроль доступа для констант, переменных, свойств и индексов

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

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

private var privateInstance = SomePrivateClass()

Методы получения и установки

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

class Samplepgm { private var counter: Int = 0 { willSet(newTotal) { println("Total Counter is: \(newTotal)") } didSet{ if counter > oldValue { println("Newly Added Counter \(counter - oldValue)") } } } } let NewCounter = Samplepgm() NewCounter.counter = 100 NewCounter.counter = 800

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700

Контроль доступа для инициализаторы и инициализаторы по умолчанию

Пользовательские Инициализаторы может быть присвоен уровень доступа, меньше или равен типу что они инициализируют. Необходимый инициализатор должен иметь тот же уровень доступа, что и класс он принадлежит. Типы параметров инициализатор не может быть более частным, чем собственный уровень доступа инициализаторе в.

Для того, чтобы объявить каждый и каждый подкласс Initialize 'требуется' ключевое слово должно быть определено перед функцией Init ().

class classA { required init() { var a = 10 println(a) } } class classB: classA { required init() { var b = 30 println(b) } } let res = classA() let print = classB()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

10 30 10

По умолчанию инициализатор А имеет тот же уровень доступа как тип инициализируется, если этот тип не определяется как общественное. При инициализации по умолчанию определяется как общественное считается внутренним. Когда пользователь нуждается в общественном месте типа быть initializable с без аргументов инициализатора в другом модуле, обеспечивают явно публичную инициализатор без аргументов как часть определения этого типа.

Контроль доступа для протоколов

Когда мы определяем новый протокол наследования функциональности от существующего протокола, как должен быть объявлен одинаковые уровни доступа, чтобы наследовать свойства друг друга. Swift контроль доступа не позволит пользователям определить «общественного» протокол, который наследует от «внутреннего» протокола.

public protocol tcpprotocol { init(no1: Int) } public class mainClass { var no1: Int // local storage init(no1: Int) { self.no1 = no1 // initialization } } class subClass: mainClass, tcpprotocol { var no2: Int init(no1: Int, no2 : Int) { self.no2 = no2 super.init(no1:no1) } // Requires only one parameter for convenient method required override convenience init(no1: Int) { self.init(no1:no1, no2:0) } } let res = mainClass(no1: 20) let print = subClass(no1: 30, no2: 50) println("res is: \(res.no1)") println("res is: \(print.no1)") println("res is: \(print.no2)")

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

res is: 20 res is: 30 res is: 50

Контроль доступа для расширений

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

Контроль доступа для дженериков

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

public struct TOS<T> { var items = [T]() private mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } } var tos = TOS<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Type Parameters") println(tos.items) tos.push("Naming Type Parameters") println(tos.items) let deletetos = tos.pop()

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Type Parameters] [Swift, Generics, Type Parameters, Naming Type Parameters]

Контроль доступа для псевдонимов типа

Пользователь может определить псевдонимы типа для лечения различных типов контроля доступа. Тот же уровень доступа или различные уровни доступа могут быть определены пользователем. Когда тип псевдоним «частный» ее ассоциированные члены могут быть объявлены как «частный, внутренний общественного типа. Когда псевдоним типа является публичной члены группы не могут быть псевдоним в качестве или "частной" имя "внутреннего"

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

public protocol Container { typealias ItemType mutating func append(item: ItemType) var count: Int { get } subscript(i: Int) -> ItemType { get } } struct Stack<T>: Container { // original Stack<T> implementation var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } // conformance to the Container protocol mutating func append(item: T) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> T { return items[i] } } func allItemsMatch< C1: Container, C2: Container where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, anotherContainer: C2) -> Bool { // check that both containers contain the same number of items if someContainer.count != anotherContainer.count { return false } // check each pair of items to see if they are equivalent for i in 0..<someContainer.count { if someContainer[i] != anotherContainer[i] { return false } } // all items match, so return true return true } var tos = Stack<String>() tos.push("Swift") println(tos.items) tos.push("Generics") println(tos.items) tos.push("Where Clause") println(tos.items) var eos = ["Swift", "Generics", "Where Clause"] println(eos)

Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат -

[Swift] [Swift, Generics] [Swift, Generics, Where Clause] [Swift, Generics, Where Clause]

www.w3ii.com

Язык программирования 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<String, Float>()

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

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 { greeting = "Hello, (name)" }

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

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

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

let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy (x)?" default: let vegetableComment = "Everything tastes good in soup." }

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

После выполнения подходящего блока кода, программа покидает оператор 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.

Обратите внимание на структуру конструктора класса EquilateralTriangle. Этот метод включает в себя три последовательных шага:

  1. инициализация членов дочернего класса;
  2. вызов конструктора родительского класса;
  3. изменение значений членов родительского класса.

Если вам необходимо выполнить определенный код до или после присваивания нового значения переменной, вы можете переопределить методы willSet и didSet нужным вам образом. Например, в приведенном ниже классе гарантируется, что длина стороны треугольника всегда будет равна длине стороны квадрата.

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) { let threeDescription = convertedRank.simpleDescription() }

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

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 { case let .Result(sunrise, sunset): let serverResponse = "Sunrise is at (sunrise) and sunset is at (sunset)." case let .Error(error): let serverResponse = "Failure... (error)" }

Давайте поэкспериментируемДобавьте третий вариант в оператор множественного выбора 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<ItemType>(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<T> { case None case Some(T) } var possibleInteger: OptionalValue<Int> = .None possibleInteger = .Some(100)

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

func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (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 и написать имя протокола или класса после двоеточия. Выражение <T: Equatable> эквивалентно выражению <T where T: Equatable>.

Автор: miden16

Источник

www.pvsm.ru

Краткий обзор языка Swift. Самый секретный проект Apple

Как уже было неоднократно отмечено, в том числе и на страницах нашего ресурса, конференция WWDC 2014 была великолепной, пусть даже на ней и не представили никакого «железа». С головой хватило одних только программных продуктов. О том, насколько общественности понравилась конференция, говорит хотя бы тот факт, что после неё не произошло традиционного для таких случаев заметного падения акций.

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

Самый секретный проект

На самом же деле работы над Swift начались ещё в 2010 году, после презентации iPad. В компании хотели создать простой, удобный и функциональный инструмент, который мог бы максимально упростить жизнь разработчикам.

Работы велись в строжайшем секрете. Более того, довольно долго над проектом трудился только один человек - Крис Латтнер (Chris Lattner), директор отдела Developer Tools. Конечно же, впоследствии штат пришлось расширить. Но всё равно, число этих людей никогда не было достаточно велико. О разработке нового языка мало кто знал даже в стенах самой Apple, хотя к 2013 году он и числился самым важным проектом Developer Tools. Важно отметить, что в компании хотели представить сразу готовый продукт, избегая всевозможных бета-версий. Поэтому работы и растянулись до 2014 года.

Тут уместно будет рассказать немного о самом Латтнере. В Apple он пришёл в 2005 году, до этого трудился на благо проекта LLVM в Университете Иллинойса, входя в число ведущих разработчиков.

LLVM (Low Level Virtual Machine) — низкоуровневая виртуальная машина, универсальная система трансформации, оптимизации и анализа программ. Проект начинался как самостоятельный, но впоследствии получил значительную поддержку со стороны. В том числе и от самой Apple, которая затем активно использовала LLVM и в собственных проектах, включая OS X и iOS. Тот же Metal разрабатывался с применением данной системы.

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

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

Особенности Swift

Детище новейших достижений, компилируемый объектно-ориентированный язык программирования Swift, опирается на такие языки, как Objective-C и C, собрав из них всё самое лучшее. Нет никаких ограничений в вопросах совместимости, языки могут прекрасно сосуществовать в одном приложении. Последнее, кстати, очень важно, поскольку уже существует огромное количество программ, написанных на Objective-C.

Интересно, что смутная идея Swift появилась ещё во времена NeXT, когда только-только начал разрабатываться Objective-C. Тогда уже родилась мысль о создании языка, который мог бы сделать процесс программирования более простым и увлекательным занятием. Но, как видим, на реализацию этой идеи потребовалось немало времени.

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

Тем временем некоторые разработчики, которые уже успели опробовать Swift на практике, утверждают, что Apple удалось максимально близко подойти к идеалу, найти ту самую золотую середину между читабельностью и простотой набора.

Как сразу же становится ясно из названия нового языка («swift» — англ. «быстрый, стремительный»), основной упор при его создании делался на скорость. В частности заявлено, что программа на Swift будет выполняться в 1,3 раза быстрее, по сравнению с аналогичной, но написанной на Objective-C.

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

Создатели приложили немало усилий к тому, чтобы сделать код Swift более выразительным и простым для понимания. Разработчик может сразу же отслеживать результаты своего творчества, просматривая отдельные части кода в т. н. «интерактивных игровых площадках» (Interactive Playgrounds). Если же для выполнения кода требуется довольно много времени, то за процессом можно следить на специально появляющейся для этого строке обратного отчёта. После того как код был усовершенствован, а алгоритм доведён до ума, разработчик просто перемещает его в свой проект. «Игровые площадки» могут быть полезны не только с точки зрения упрощения процедуры разработки, но и для оттачивания навыков использования Swift.

Традиционное приложение «Hello, World» выглядит в Swift следующим образом:

println("Hello, world")

А вот и ещё один пример несложного кода:

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

Выглядит достаточно привлекательно для того, чтобы попробовать освоить новый язык. Кстати, сделать это можно уже сегодня. Всё что требуется, так это скачать бета-версию среды разработки Xcode 6 и подробное 500-страничное руководство по использованию языка.

Критика Swift

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

Поступает критика действий Apple, которой «лучше было бы заняться развитием таких языков, как Python или Ruby, вместо того, чтобы создавать ещё один». Такие слова подкрепляются мнением, что эти инструменты уже активно используются разработчиками со всего мира. Также мне довелось найти мнение, согласно которому Apple напрасно делает основную ставку на скорость. Мол, при современных уровнях развития железа это не так уж и важно.

Но больше всего раздражения вызывает тот факт (впрочем, как и всегда в подобных случаях), что Apple создала нечто только для себя, по своим стандартам и на своих основах. Причём заявляется, что хотя Swift и не слишком-то отличается от множества других языков, компания вновь заявляет о создании принципиально нового продукта.

Вместо послесловия

Можно критиковать Apple за чрезмерную закрытость и самонадеянность. Можно восхищаться простотой Swift и чистотой его кода. Но факт остаётся фактом — будущее нового языка программирования пока неясно. И возможны два сценария развития.

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

Сценарий второй. Подходы, применённые в Swift, становятся нормой в мире программирования. Apple снова удаётся повлиять на весь мир, изменив общепринятые среди разработчиков нормы. Идея «игровых площадок», вкупе с прозрачностью кода нового языка вполне могут совершить настоящий переворот в деле изучения программирования. А это позволит полностью пересмотреть весь процесс образования и спровоцировать появление программистов нового поколения.

Кстати, я не буду удивлён, если через несколько лет, тщательно «отполировав» Swift, доведя его до совершенства, Apple заявит, что вообще намерена отказаться от Objective-C и сделать ставку на новый язык.

uip.me

новый язык программирования от Apple

03.06.2014

Добрый вечер, уважаемые читатели. Наверное, многие из вас знают, что вчера была главная софтверная конференция WWDC 2014 от Apple, на которой были представлены ios 8, OS X Yosemite, а также новый язык программирования Swift. Этот пост как раз таки и затронет кратко новый язык программирования.

Думаю, даже, если вы никогда ничего не писали под айфоны/маки, то всё равно примерно знаете, что такое Objective-C. Если, например, платформу Node.JS можно охарактеризовать одной фразой Callback Hell (которые возникают из-за event driven парадигмы), то Objective-C лично я бы охарактеризовал, как один из самых грязных и много буквенных языков программирования. Нужно писать очень много текста для того, чтобы выразить алгоритмы из своей головы (я не пишу для айфонов, если я не прав, поправьте меня).

В связи с таким минусом языка (а также из-за ряда других «проблем»), далеко не все разработчики решаются пойти писать что-то для айфонов. С одной стороны, это круто — писать под такую платформу. Тут тебе и куча денег, и живой результат сразу видно, и порог входа не огромный (как, например, в алгоритмической разработке). Однако, с другой стороны, не все готовы из-за бОльшей зарплаты писать на Objective-C.

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

Другими словами, язык Swift — это полноценная замена Objective-C. Вам больше не придётся писать что-то на обжективе. Вы можете использовать свифт, а также вызывать код на C/C++, если у вас есть критические по скорости части приложения.

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

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

Компания Apple выпустила отличную книжку, которая полноценно описывает язык. Доступна версия, как для iBook, так и для online чтения — https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html.

Кроме того, уже есть канал в irc на сервере freenode (chat.freenode.net). Канал — #swift-lang. Уже сейчас на канале 170 человек, и, надо заметить, сейчас там проходит активное обсуждение языка.

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

// возврат нескольких значений из функции 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)

Не правда ли, выглядит круто? Как мне показалось, язык вобрал в себя всё лучшее от C#, JavaScript, Python и CoffeeScript.

Поздравляю вас, уважаемые коллеги, с выходом такого классного на первый взгляд языка. Swift-а вам!

————————————Update от 04.06.2014

Уважаемый Рахим Давлеткалиев (a-ka freetonik) — создатель платформы https://hexlet.org/ буквально за 2 дня сделал видео курс на русском языке, который основан на официальной книжке от Apple. Ссылка: https://hexlet.org/course/swift/.

Категории: Программирование

Метки: программирование

hixon.ru

Как новый язык программирования Swift повлияет на всех нас?

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

Язык Swift был официально представлен на очередной Международной конференции разработчиков Apple WWDC 2014 и был встречен чрезвычайно тепло. Профессионалы с самого начала оценили большой потенциал новичка, но что же может дать Swift другим категориям пользователей? Давайте разберёмся.

swift-effects-01

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

Почему специалисты на WWDC 2014 были сразу так воодушевлены появлением Swift? Всё дело в первой же фразе, в которой старший вице-президент Apple по разработке ПО Крейг Федериги упомянул новый язык: «Что, если у нас был бы Objective-C без рудиментов C? И мы не просто так подумали об этом, мы сделали больше. У нас есть новый язык программирования. Он называется Swift и он совершенно крут».

https://www.youtube.com/watch?v=l62x8Oq_QP4

До последнего времени для разработки приложений для платформы Apple можно было использовать языки C, С++ или Objective-C. Последний был создан известным программистом Брэдом Коксом в начале 1980-х, и с 1983 года он используется в Apple для создания разнообразных приложений. Objective-C многое позаимствовал из C и С++, принципиальным отличием было введение объектно-ориентированной модели программирования, реализованной в стиле Smalltalk, в которой объектам посылаются сообщения. Эта модель была удобнее, чем реализованная в многопарадигменном С++ и, тем более, чем в классическом процедурном C.

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

swift-effects-04

Очевидно, что в Apple поставили задачу сохранить в Swift всё хорошее, что было в Objective-C, в частности, упомянутую производительность кода, соединив её с привычными сегодня удобствами интерпретируемых языков. В Swift избавились от множества рудиментарного мусора, доставшегося Objective-C от предшественников. Кроме того, Swift позволяет программисту решать поставленные задачи в нескольких различных моделях, среди которых функциональное программирование, при котором все действия представлены в виде математических вычислений; процедурное, где действия выполняются последовательно и линейно, и объектно-ориентированное, где все данные представлены в качестве объектов.

Swift даёт на выходе высокооптимизированный LLVM-совместимый байткод (т.е. низкоуровневые инструкции, выполняемые непосредственно устройством) и работает с теми же API. что и Objective-C или C. Благодаря такой совместимости можно интегрировать код Swift в уже существующие проекты, библиотеки и приложения. А если вам потребуется опуститься на уровень ниже и вручную задать, к примеру, тип переменных или параметры управление памятью, вы всегда сможете вернуться к Objective-C.

Помните скандальную игрушку FlappyBird? Так вот, всего через несколько дней после анонса нового языка, её полный клон FlappySwift переписали на Swift. Посмотрите по ссылке, насколько компактен и чист исходный код и насколько он напоминает современные интерпретируемые языки.

swift-effects-02

С профессиональными разработчиками разобрались. А что может дать Swift студентам, только делающим первые шаги в программировании? Вполне может ожидать того, что классическая фраза «Hello World» совсем скоро будет выводиться на экран преимущественно с помощью Swift. Почему? Потому что Swift прост в освоении, нагляден и интуитивно понятен, может использовать разные модели программирования и при этом обеспечивает высокие скорости Objective-C.

Но мы ещё не упомянули о Playgrounds, то есть, буквально, об «игровых площадках», одной из полезнейших новых функций в Xcode 6, в которой, собственно, и реализован новый язык Swift. Напомним, что существует такая аббревиатура REPL, описывающая простую интерактивную среду программирования, позволяющую быстро ознакомиться с особенностями какого-то нового языка. REPL расшифровывается как read-eval-print loop, то есть «прочитать, принять, напечатать, повторить», и происходит от названий элементарных функций языка Lisp. Такая последовательность позволяет писать и интерпретировать код строчка за стройкой, не влезая в основной проект — это полезно, например, при отладке или при проверке какой-то пришедшей вам в голову идеи.

Playgrounds в Xcode 6 — это именно такие REPL, дающие возможность строчка за строчкой прогонять приложение и пошагово оценивать его работу. И для студентов нет ничего лучше, чем сразу видеть наглядный результат, как работает каждая новая строчка. Тем самым, программисту уже не нужно быть высококлассным профессионалом, способным обнаружить мелкую ошибку в море строчек кода, а это означает возможность существенно понизить планку для входа в число разработчиков для iOS и OS X. Разумеется, речь не идёт о больших проектах — хотя, студентов многие опрометчиво недооценивают.

Наконец, что появление Swift даст обычным пользователям, большинство из которых не является программистами и мало что знает о каких-то там языках? Для потребителя важно, чтобы приложение чётко исполняло заявленные функции и было удобным и стабильным.

Очевидно, что внедрение Swift заметно скажется на всей программной экосистеме Apple. Поскольку разработка приложений для iOS и OS X становится всё проще и легче, многим профессионалам в других языках и платформах захочется попробовать свои силы на новом поле деятельности. Но что это может значить?

swift-effects-03

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

Если вы уже сейчас хотите оценить возможности Swift, то для скачивания бета-версии XCode 6 вам потребуется платный аккаунт разработчика. Всем остальным придётся подождать до осени, а тем временем можно ознакомиться с подробнейшим 500-страничным пособием по этом новому языку, которое, как мне кажется, будет интересно не только профессиональным программистам.

www.computerra.ru


Смотрите также

 

..:::Новинки:::..

Windows Commander 5.11 Свежая версия.

Новая версия
IrfanView 3.75 (рус)

Обновление текстового редактора TextEd, уже 1.75a

System mechanic 3.7f
Новая версия

Обновление плагинов для WC, смотрим :-)

Весь Winamp
Посетите новый сайт.

WinRaR 3.00
Релиз уже здесь

PowerDesk 4.0 free
Просто - напросто сильный upgrade проводника.

..:::Счетчики:::..

 

     

 

 

.