|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Краткий обзор языка 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 уже включен в учебную программу многих ведущих учебных учреждений. У этого языка программирования огромный потенциал. Сложность обучения SwiftSwift является безопасным языком, который позволит огородить вас от большинства ошибок в процессе программирования. Он подскажет, где находится ошибка и почему не компилируется программа. Но с другой стороны, тут кроется жесткая типизация. Язык от 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 ещё достаточно сырой. 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 использует ту же среду выполнения, как существующая система 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 и загрузить его, нажав на данной ссылке рядом с образа диска. После загрузки файла DMG, вы можете установить его простым двойным щелчком по ней и следуя данной инструкции. И, наконец, следовать данной инструкции и поместите значок 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. Эти зарезервированные слова не могут быть использованы в качестве постоянных или переменных или любых других имен идентификаторов, если они не отделались обратные кавычки - Ключевые слова, используемые в объявлениях
Ключевые слова, используемые в отчетности
Ключевые слова, используемые в выражениях и типов
Ключевые слова, используемые в конкретных контекстах
ПробелыСтрока, содержащая только пробелы, возможно, с комментарием, известен как пустая строка, и 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 предлагает программисту богатый ассортимент встроенных, а также определяемые пользователем типы данных. Следующие типы основных типов данных являются наиболее часто при объявлении переменных -
Мы перечислили здесь несколько важных моментов, связанных с типами Integer -
Bound ЗначенияВ следующей таблице показаны тип переменной, сколько памяти требуется для сохранения значения в памяти, а что является максимальное и минимальное значение, которое может храниться в таком виде переменных.
Псевдонимы ТипВы можете создать новое имя для существующего типа с использованием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 поддерживает следующие основные типы переменных -
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 millionsSwift также вводит тип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 valueOptionals похожи наноль , используя с указателями в 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"Строковые литералы не могут содержать неэкранированный двойные кавычки ( "), неэкранированные обратной косой черты (\), возврат каретки или перевод строки Специальные символы могут быть включены в строковых литералов, используя следующие управляющие последовательности. -
В следующем примере показано, как использовать несколько строковых литералов - import Cocoa let stringL = "Hello\tWorld\n\nHello\'Swift\'" println(stringL)Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - Hello World Hello'Swift'булевы литералыЕсть три Булевы литералы и они являются частью стандартных Swift ключевых слов -
Оператор является символом, который указывает компилятору выполнять конкретные математические или логические манипуляции. Objective-C богат встроенных операторов и предоставляет следующие типы операторов -
Этот учебник будет объяснить арифметическую, реляционные, логические, побитовое, назначение и другие операторы один за другим. Арифметические операторыВ следующей таблице представлены все арифметические операции, поддерживаемые Swift языком. Предположим , переменнаяА имеет 10 и переменная Bимеет 20, а затем - Показать примеры
Операторы сравненияВ следующей таблице приведены все операторы сравнения, поддерживаемые Swift языком. Предположим , переменнаяА имеет 10 и переменная Bимеет 20, а затем - Показать примеры
Логические операторыВ следующей таблице приведены все логические операторы, поддерживаемые Swift язык. Предположим , переменнаяА имеет место 1 и переменная Bимеет 0, а затем - Показать примеры
Битовые операторыБитовые операторы работают над битами и выполнять по крупицам операции. Таблицы истинности для &, |, и ^ следующим образом -
Битовые операторы поддерживаются Swift языка, перечислены в следующей таблице. Предположим , переменнаяА имеет 60 и переменная Bимеет 13, а затем - Показать примеры
Операторы присваиванияSwift поддерживает следующие операторы присваивания - Показать примеры
Диапазон ОператорыSwift включает в себя два оператора диапазона, которые являются ярлыками для выражения диапазона значений. В следующей таблице приведено описание этих двух операторов. Показать примеры
Разное ОператорыSwift поддерживает несколько других важных операторов , включаядиапазон и: которые подробно описаны в следующей таблице. Показать примеры
Операторы ВнеочередныеПриоритет операторов определяет группировку терминов в выражении. Это влияет, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения. Например, х = 7 + 3 * 2; Здесь, х присваивается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала получает умножается на 3 * 2, а затем добавляет в 7. Здесь, операторы с наивысшим приоритетом отображаются в верхней части таблицы, те, с самым низким появляются в нижней части. В выражении, высшие операторы приоритета будут оцениваться в первую очередь. Показать пример
Принятие решений структуры требуют, чтобы программист задает одно или несколько условий , которые будут оценены или проверены программой, вместе с заявлением или заявлений , которые будут выполняться , если условие определяется , чтобы бытьправдой, и , возможно, другие операторы должны быть выполнены , если условие определяется ложными. Ниже приводится общее от типичной структуры принятия решений, найденного в большинстве языков программирования - Swift предоставляет следующие типы операторов принятия решений. Нажмите следующие ссылки, чтобы проверить их детали.
? : ОператорМы покрылиусловный оператор: в предыдущей главе , которая может быть использована для замены IF ... ELSEзаявления. Он имеет следующий общий вид - Exp1 ? Exp2 : Exp3;Где EXP1, exp2 и exp3 являются выражениями. Обратите внимание на использование и размещение в толстой кишке. ? Значение а выражение определяется следующим образом : EXP1 оценивается.Если это правда, то exp2 вычисляется и становится значениемвсего? Экспрессии.Если EXP1 ложно, то exp3 вычисляется и его значение становится значением выражения. Там может быть ситуация, когда вам нужно выполнить блок кода несколько количество раз. В целом операторы выполняются последовательно: первый оператор функции выполняется первым, а затем второй, и так далее. Языки программирования обеспечивают различные управляющие структуры, позволяющие более сложных путей выполнения. Оператор цикла позволяет выполнить оператор или группа операторов несколько раз. Ниже приводится общее от из оператора цикла в большинстве языков программирования - Swift язык программирования предоставляет следующие виды цикла для обработки циклических требований. Нажмите следующие ссылки, чтобы проверить их детали.
Операторы управления LoopОператоры управления Loop изменить исполнение от своей обычной последовательности. Когда выполнение выходит из сферы, все автоматические объекты, которые были созданы в этой области видимости уничтожаются. Swift поддерживает следующие операторы управления. Нажмите следующие ссылки, чтобы проверить их детали.
Строки в 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 equalUnicode строкВы можете получить доступ к 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 поддерживает широкий спектр методов и операторов, связанных с струнных инструментов -
Персонаж в 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 GSwift массивы используются для хранения упорядоченные списки значений одного и того же типа. 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 = trueSwiftсловари используются для хранения неупорядоченные списки значений одного и того же типа.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)Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 125VARIADIC ПараметрыКогда мы хотим определить функцию с несколькими числом аргументов, то мы можем объявить членов как '' параметров переменным числом. Параметры могут быть определены как 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 языках. Константы и ссылки на переменные, определенные внутри функций фиксируются и хранятся в муфтах. Функции рассматриваются как частные случаи закрытия и принимает следующие три формы -
Закрытие выражения в 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Выражения в муфтахВложенные функции обеспечивают удобный способ именования и определения блоков кода. Вместо того, чтобы представлять всю функцию декларации и имя конструкции используются для обозначения коротких функций. Представляя функцию в ясной кратком заявлении с сфокусированного синтаксиса достигается за счет закрытия выражений. По возрастанию по программе заказаСортировка строки достигается с помощью ключа Стрижи зарезервированной функции "отсортированных", которая уже доступна в стандартной библиотеке. Функция сортирует заданные строки в порядке возрастания и возвращает элементы в новый массив с такого же размера и типа данных, упомянутых в старом массиве. Старый массив остается неизменным. Два аргумента представлены в отсортированном функции -
Нормальная функция с входной строки записывается и передается в отсортированном функции, чтобы получить строки сортируются в новый массив, который показан ниже - func ascend(s1: String, s2: String) -> Bool { return s1 > s2 } let stringcmp = ascend("swift", "great") println (stringcmp)Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - trueИсходный массив для сортировки для мороженного дается как "Свифт" и "большой". Функция для сортировки массива объявлен как строки типа данных и его тип возвращаемого значения упоминается как Boolean. Обе строки сравниваются и сортируются в порядке возрастания и сохраняются в новом массиве. Если сортировка выполняется успешно, то функция вернет истинное значение, иначе она вернет ложь. Синтаксис выражений Закрытие использует -
Выражение Закрытие не поддерживает значения по умолчанию. 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Декларирование стенографии аргументе имена, как ClosuresSwift автоматически предоставляет сокращенные имена аргументов встраивать затворы, которые могут быть использованы для обозначения значений аргументами замыкания именами $ 0, $ 1, $ 2, и так далее. var shorthand: (String, String) -> String shorthand = { $1 } println(shorthand("100", "200"))Здесь $ 0 и $ 1 относятся к первой и второй аргументы Струнные Замыкание в. Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 200Swift облегчает пользователю представлять Роликовые закрытий, обозначающим имен аргументов, представляя $ 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 ClosuresSwift перечисление не присваивает его значение по умолчанию, как члены 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 и он будет перейти к этому конкретному заявлению. Выход будет отображаться как "климат холодный". Точно так же все члены могут быть доступны через отчетности коммутатора. Если условие не выполняется он печатает по умолчанию 'климата не является предсказуемым ». Перечень может быть дополнительно классифицированы и соответствующих значений и исходных значений. Разница между соответствующими значениями и необработанные значения
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 язык предоставляет функциональные возможности для определения структуры как пользовательских типов данных для построения функциональных блоков. Экземпляры структуры передаются его значением для определенных блоков для дальнейших манипуляций. Необходимость структур, имеющих
Структуры в стрижа передать своих членов с их значениями, а не его ссылки. 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 позволяет создавать классы в виде отдельного файла и внешние интерфейсы будут создаваться по умолчанию, как только классы инициализируются. Преимущества наличия классов
Общие характеристики классов и структур
Синтаксис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 всегда назначаются и розданы в качестве ссылки на существующий экземпляр, а не в качестве копии.
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - main.SampleClass main.SampleClassSwift язык предоставляет свойства для класса, перечисления или структуры для ассоциированных значений. Свойства могут быть разделены на хранимыми свойства и вычисляемых свойств. Разница между хранимыми свойств и вычисленных свойств.
Оба Хранимые и вычисляемые свойства связаны с типом экземпляров. Когда свойства связаны с его значениями типа, то она определяется как "Свойства типа". Хранимые и вычисляемые свойства, как правило, связаны с экземплярами определенного типа. Тем не менее, свойства также могут быть связаны с самим типом. Такие свойства известны как свойства типа. также используются наблюдатели собственности.
Хранимые СвойстваSwift вводит Хранимые понятие собственности для хранения экземпляров констант и переменных. Хранимые свойства констант определяются 'давайте ключевым словом и Хранится свойства переменных определяются "Var" ключевое слово.
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 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 ', где он не будет вычислять начальные значения, когда переменная инициализируется в первый раз. 'Ленивым' используется модификатор перед объявлением переменной, чтобы иметь его в качестве ленивого хранится имущество. Ленивые свойства используются -
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 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 наблюдать и реагировать на значения свойств используются Обозреватели собственности. Каждый раз, когда значения свойств устанавливаются наблюдателей собственности называются. За исключением ленивых хранимых свойств мы можем добавить наблюдателей на недвижимость в 'унаследовали' свойство методом 'переопределение'. Обозреватели свойство может быть определено либо.
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 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Расчеты Класс определяет два метода экземпляра -
И, наконец, для печати методы вычисления со значениями для а и Ь называется. Методы экземпляра доступны с '.' синтаксис точка Локальные и внешние имена параметров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 } }Пример1struct 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 timesExample2class 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.0Swift индекс поддерживает один параметр для нескольких деклараций параметров для соответствующих типов данных. Программа объявляет структуру 'Матрица' как двухмерной матрицы массива 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Способность принимать чем больше формы определяется в порядке наследования. Как правило, класс может наследовать методы, свойства и функциональные возможности из другого класса. Классы могут быть дополнительно классифицированы в к югу от класса и суперкласса.
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 класс определяет студентов знаков и вызывает метод печати () для отображения метки студентов. ПерекрытиеДоступ к экземпляра супер класс, методы типа, например, свойства типа и нижние индексы подкласс обеспечивает концепцию переопределение. 'Переопределение' используется ключевое слово, чтобы переопределить методы, объявленные в суперклассе. Доступ к суперкласса методы, свойства и подстрочный'Супер' ключевое слово используется в качестве префикса для доступа к методам, свойствам и нижние индексы, объявленные в родительском классе.
Методы ПереопределениеУнаследованные методы экземпляра и типа могут быть переопределены ставиться ключевое слово для наших методов, определенных в нашем подклассе. Здесь печать () переписан в подклассе для доступа к свойству типа, упомянутого в суперкласса печати (). Кроме того, новый экземпляр крикет () супер класс создается как '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 позволяет пользователю предоставлять пользовательские чтения и записи, чтобы переопределить унаследованное имущество, является ли это хранится или вычисляется свойство. Подкласс не знает унаследованное имя свойства и тип. Поэтому очень важно, чтобы пользователь должен указать в подклассе, имя и тип надвигающегося имущества, указанного в супер классе. Это можно сделать двумя способами -
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 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() { //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 делегации
Наследование классов и инициализацияТипы классов имеют два вида инициализаторах, чтобы проверить, является ли получить определенные свойства, сохраненные начальное значение, а именно назначенные инициализаторах и удобство инициализаторах. Назначенные Инициализаторы и удобство Инициализаторы
Программа для назначенных инициализаторах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: 50Initializer Наследование и переопределение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 blankFailable Инициализаторы для перечислений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 ExistFailable Инициализаторы для классов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 InitializerSwift обеспечивает "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 Программа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 98ARC 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: ARCARC Слабые и без владельца СсылкиСвойства типа класса имеет два пути решения сильных опорных циклов - Эти ссылки используются для того, чтобы по одному экземпляру для обозначения других экземпляров в опорном цикле. Тогда экземпляры могут относиться к каждому случаях вместо того, чтобы заботиться о сильном эталонным цикла. Когда пользователь знает, что некоторые экземпляр может возвращать "ноль" значения, которые мы можем указать, что с помощью слабой ссылки. Когда экземпляр собирается вернуть что-то, а не ноль, то объявить его с несобственным ссылкой. Слабая ссылка Программа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()Процесс выполнения запросов, вызывая свойства, нижние индексы и методы на факультативной, который может быть 'ноль' определяется в качестве дополнительного логического вывода. Дополнительно возврата сцепления два значения -
Так как несколько запросов к методам, свойствам и индексы сгруппированы отказ одной цепи будет влиять на всю цепочку и результаты в значение 'ноль'. Дополнительный 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Вызов методов с помощью дополнительных Chainingclass 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Дополнительное сцепление используется для установки и извлечения значения индекс для проверки, возвращает ли вызов к этому индексу значение. '?' помещается перед подстрочный расчалок для получения доступа к необязательное значение на определенном нижним индексом. Программа 1class 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' не указано. Поэтому программа вызов функции будет возвращать только еще часть, тогда как вернуть ценности, которые мы должны определить значения для конкретной функции принадлежности. Программа 2class 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', HertzAnyObjectДля того, чтобы представить экземпляр любого типа класса, используется ключевое слово '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 SwiftMutating Метод Требования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()Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - WednesdayInitializer ТребованияКачели позволяет пользователю инициализировать протоколы следовать типа соответствия, аналогичную нормальных инициализаторах. Синтаксис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Протоколы как типыВместо реализации функциональных возможностей в протоколе они используются в качестве типов для функций, классов, методов и т.д. Протоколы могут быть доступны как в типах -
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - 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Проверка соответствия протоколаПротокол соответствия испытываемого "есть" и "как" операторы, аналогичные таковым отливки типа.
Когда мы запускаем эту программу, используя игровую площадку, мы получаем следующий результат - Area is 12.5663708 Area is 198.0 Rectangle area is not definedSwift язык предоставляет функции '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 языком. Они являются общественным, Внутренняя и частный доступ.
Синтаксис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. Русская версияПривет! 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О языке SwiftSwift – это новый язык программирования для разработки 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. Этот метод включает в себя три последовательных шага:
Если вам необходимо выполнить определенный код до или после присваивания нового значения переменной, вы можете переопределить методы 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 новый язык программирования от Apple03.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 для разработчиков, поскольку без их описания не получится понять, что же новый язык даст всем остальным. Почему специалисты на 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 можно было назвать чрезвычайно быстрое выполнение целого ряда функций. Очевидно, что в Apple поставили задачу сохранить в Swift всё хорошее, что было в Objective-C, в частности, упомянутую производительность кода, соединив её с привычными сегодня удобствами интерпретируемых языков. В Swift избавились от множества рудиментарного мусора, доставшегося Objective-C от предшественников. Кроме того, Swift позволяет программисту решать поставленные задачи в нескольких различных моделях, среди которых функциональное программирование, при котором все действия представлены в виде математических вычислений; процедурное, где действия выполняются последовательно и линейно, и объектно-ориентированное, где все данные представлены в качестве объектов. Swift даёт на выходе высокооптимизированный LLVM-совместимый байткод (т.е. низкоуровневые инструкции, выполняемые непосредственно устройством) и работает с теми же API. что и Objective-C или C. Благодаря такой совместимости можно интегрировать код Swift в уже существующие проекты, библиотеки и приложения. А если вам потребуется опуститься на уровень ниже и вручную задать, к примеру, тип переменных или параметры управление памятью, вы всегда сможете вернуться к Objective-C. Помните скандальную игрушку FlappyBird? Так вот, всего через несколько дней после анонса нового языка, её полный клон FlappySwift переписали на Swift. Посмотрите по ссылке, насколько компактен и чист исходный код и насколько он напоминает современные интерпретируемые языки. С профессиональными разработчиками разобрались. А что может дать 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 становится всё проще и легче, многим профессионалам в других языках и платформах захочется попробовать свои силы на новом поле деятельности. Но что это может значить? Прежде всего, это означает, что к мобильным и компьютерным платформам Apple будет привлечено большее число разработчиков. Больше разработчиков — это больше приложений и больше выбора для потребителя. А вот вопрос о качественном уровне такого софта придётся оставить открытым. Пока что Swift слишком новая технология и она ещё не освоена даже профессиональными программистами для устройств Apple. К тому же она более доступна в понимании для студентов и прочих людей, делающих первые шаги в программировании. К чему всё это может привести, пока сказать трудно. Если вы уже сейчас хотите оценить возможности Swift, то для скачивания бета-версии XCode 6 вам потребуется платный аккаунт разработчика. Всем остальным придётся подождать до осени, а тем временем можно ознакомиться с подробнейшим 500-страничным пособием по этом новому языку, которое, как мне кажется, будет интересно не только профессиональным программистам. www.computerra.ru |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|