Учебники

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

Swift — Обзор

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

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

  • Swift 4 предоставляет современные функции программирования.

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

  • Swift 4 — это фантастический способ написания приложений для iOS и OS X.

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

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

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

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

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

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

Swift 4 — это фантастический способ написания приложений для iOS и OS X.

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

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

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

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

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

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

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

Свифт — Окружающая среда

Настройка локальной среды

Swift 4 предоставляет игровую платформу для учебных целей, и мы собираемся настроить то же самое. Вам нужно программное обеспечение xCode, чтобы начать кодирование Swift 4 в Playground. Если вы знакомы с концепциями Swift 4, вы можете использовать xCode IDE для разработки приложений для iOS / OS x.

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

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

Список программного обеспечения

Теперь выберите xCode и загрузите его, нажав на данную ссылку рядом с изображением диска. После загрузки файла dmg вы можете установить его, просто дважды щелкнув по нему и следуя приведенным инструкциям. Наконец, следуйте приведенным инструкциям и поместите значок xCode в папку «Приложение».

Xcode

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

Открыть Xcode

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

Окно детской площадки

Ниже приведен код, взятый из стандартного окна Swift 4 Playground.

import UIKit
var str = "Hello, playground"

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

import Cocoa
var str = "Hello, playground"

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

Hello, playground

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

Swift — основной синтаксис

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

/* My first program in Swift 4 */
var myString = "Hello, World!"

print(myString)

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

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

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

Hello, World!

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

Импорт в Свифт 4

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

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

Жетоны в Свифт 4

Программа Swift 4 состоит из различных токенов, и токен — это либо ключевое слово, идентификатор, константа, строковый литерал, либо символ. Например, следующий оператор Swift 4 состоит из трех токенов:

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

Комментарии

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

/* My first program in Swift 4 */

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

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

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

// My first program in Swift 4

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

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

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

/* My first program in Swift 4 */
var myString = "Hello, World!"; print(myString)

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

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

Swift 4 не допускает использование специальных символов, таких как @, $ и% в идентификаторах. Swift 4 — это чувствительный к регистру язык программирования. Таким образом, рабочая сила и рабочая сила — это два разных идентификатора в Swift 4. Вот несколько примеров допустимых идентификаторов:

Azad        zara   abc   move_name   a_123
myname50    _temp  j     a23b9       retVal

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

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

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

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

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

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

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

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

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

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

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

Пробелы

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

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

var age

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

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

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

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

int fruit = apples +oranges    //is a wrong statement
int fruit = apples + oranges   //is a Correct statement

литералы

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

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

Печать в Swift

Чтобы напечатать что-нибудь в swift, у нас есть ключевое слово «print».

Печать имеет три разных свойства.

Предметы — предметы для печати

Разделитель — разделитель между элементами

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

print("Items to print", separator: "Value " , terminator: "Value")
// E.g. of print statement.

print("Value one")
// prints "Value one \n" Adds, \n as terminator and " " as separator by
default.

print("Value one","Value two", separator: " Next Value" , terminator: " End")
//prints "Value one Next Value Value two End"

В приведенном выше коде первый оператор печати добавляет \ n, перевод строки новой строки в качестве терминатора по умолчанию, где, как и во втором операторе печати, мы указали «Конец» в качестве терминатора, поэтому он будет печатать «Конец» вместо \ n.

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

Swift — Типы данных

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

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

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

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

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

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

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

  • Bool — Это представляет логическое значение, которое является или истиной или ложью.

  • Строка — это упорядоченная коллекция символов. Например, «Привет, мир!»

  • Символ — это односимвольный строковый литерал. Например, «С»

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

  • Кортежи — это используется для группировки нескольких значений в одно составное значение.

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

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

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

Bool — Это представляет логическое значение, которое является или истиной или ложью.

Строка — это упорядоченная коллекция символов. Например, «Привет, мир!»

Символ — это односимвольный строковый литерал. Например, «С»

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

Кортежи — это используется для группировки нескольких значений в одно составное значение.

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

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

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

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

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

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

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

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

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

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

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

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

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

Связанные значения

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

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

Введите псевдонимы

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

typealias newname = type

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

typealias Feet = Int

Теперь следующее объявление является абсолютно допустимым и создает целочисленную переменную с именем distance —

Live Demo

typealias Feet = Int
var distance: Feet = 100
print(distance)

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

100

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

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

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

Live Demo

var varA = 42
varA = "This is hello"
print(varA)

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

main.swift:2:8: error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"

Вывод типа

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

Live Demo

// varA is inferred to be of type Int
var varA = 42
print(varA)

// varB is inferred to be of type Double
var varB = 3.14159
print(varB)

// varC is also inferred to be of type Double
var varC = 3 + 0.14159
print(varC)

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

42
3.14159
3.14159

Swift — переменные

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

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

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

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

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

  • Bool — Это представляет логическое значение, которое является или истиной или ложью.

  • Строка — это упорядоченная коллекция символов. Например, «Привет, мир!»

  • Символ — это односимвольный строковый литерал. Например, «С»

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

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

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

Bool — Это представляет логическое значение, которое является или истиной или ложью.

Строка — это упорядоченная коллекция символов. Например, «Привет, мир!»

Символ — это односимвольный строковый литерал. Например, «С»

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

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

Объявление переменной

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

var variableName = <initial value>

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

Live Demo

var varA = 42
print(varA)

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

42

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

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

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

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

Live Demo

var varA = 42
print(varA)

var varB:Float

varB = 3.14159
print(varB)

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

42
3.1415901184082

Именование переменных

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

Вы можете использовать простые символы или символы Юникода для именования ваших переменных. В следующих примерах показано, как вы можете назвать переменные —

Live Demo

var _var = "Hello, Swift 4!"
print(_var)

var 你好 = "你好世界"
print(你好)

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

Hello, Swift 4!
你好世界

Переменные печати

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

Live Demo

var varA = "Godzilla"
var varB = 1000.00

print("Value of \(varA) is more than \(varB) millions")

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

Value of Godzilla is more than 1000.0 millions

Swift — опционально

Swift 4 также вводит тип Optionals , который обрабатывает отсутствие значения. Необязательные говорят, что «есть значение, и оно равно x» или «нет значения вообще».

Optional — это отдельный тип, фактически один из новых сверхмощных перечислений Swift 4. У него есть два возможных значения, None и Some (T) , где T — это связанное значение правильного типа данных, доступного в Swift 4.

Вот необязательное объявление Integer —

var perhapsInt: Int?

Вот необязательное объявление String —

var perhapsStr: String?

Вышеуказанное объявление эквивалентно явной инициализации его значением nil, что означает отсутствие значения.

var perhapsStr: String? = nil

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

Live Demo

var myString:String? = nil

if myString != nil {
   print(myString)
} else {
   print("myString has nil value")
}

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

myString has nil value

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

Принудительная распаковка

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

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

Live Demo

var myString:String?

myString = "Hello, Swift 4!"

if myString != nil {
   print(myString)
} else {
   print("myString has nil value")
}

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

Optional("Hello, Swift 4!")

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

Live Demo

var myString:String?

myString = "Hello, Swift 4!"

if myString != nil {
   print( myString! )
} else {
   print("myString has nil value")
}

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

Hello, Swift 4!

Автоматическое развертывание

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

Live Demo

var myString:String!
myString = "Hello, Swift 4!"

if myString != nil {
   print(myString)
} else {
   print("myString has nil value")
}

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

Hello, Swift 4!

Опциональная привязка

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

Необязательная привязка для оператора if выглядит следующим образом:

if let constantName = someOptional {
   statements
}

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

Live Demo

var myString:String?
myString = "Hello, Swift 4!"

if let yourString = myString {
   print("Your string has - \(yourString)")
} else {
   print("Your string does not have a value")
}

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

Your string has - Hello, Swift 4!

Свифт — Кортежи

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

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

Например, («Tutorials Point», 123) — это кортеж с двумя значениями, одно из которых имеет строковый тип, а другое — целочисленный тип. Это легальная команда.

let PracticeError = (501, «Не реализовано») — это ошибка, когда что-то на сервере не реализовано. Возвращает два значения. Код ошибки и описание.

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

Вот синтаксис объявления Tuple —

var TupleName = (Value1, value2,… any number of values)

Вот объявление Tuple —

var error501 = (501, “Not implemented”)

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

Вот пример доступа к Значениям кортежа —

print(“The code is\(error501.0)”)
print(“The definition of error is\(error501.1)”)

Вы можете называть переменные кортежа при объявлении, и вы можете вызывать их, используя их имена

var error501 = (errorCode: 501, description: “Not Implemented”)
print(error501.errorCode)   // prints 501.

Кортежи помогают возвращать несколько значений из функции. Например, веб-приложение может вернуть кортеж типа («String», Int), чтобы показать, была ли загрузка успешной или неудачной.

Возвращая разные значения в кортеже, мы можем принимать решения в зависимости от разных типов кортежей.

Примечание. Кортежи полезны для временных значений и не подходят для сложных данных.

Свифт — Константы

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

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

Декларация констант

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

let constantName = <initial value>

Ниже приведен простой пример того, как объявить константу в Swift 4.

Live Demo

let constA = 42
print(constA)

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

42

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

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

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

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

Live Demo

let constA = 42
print(constA)

let constB:Float = 3.14159
print(constB)

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

42
3.1415901184082

Константы именования

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

Вы можете использовать простые символы или символы Юникода для именования ваших переменных. Ниже приведены действительные примеры —

Live Demo

let _const = "Hello, Swift 4!"
print(_const)

let 你好 = "你好世界"
print(你好)

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

Hello, Swift 4!
你好世界

Константы печати

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

Live Demo

let constA = "Godzilla"
let constB = 1000.00

print("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"

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

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

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

Live Demo

let stringL = "Hello\tWorld\n\nHello\'Swift 4\'"
print(stringL)

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

Hello World

Hello'Swift 4'

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

Есть три логических литерала, и они являются частью стандартных ключевых слов Swift 4 —

  • Значение true, представляющее истину.

  • Значение false, представляющее ложь.

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

Значение true, представляющее истину.

Значение false, представляющее ложь.

Значение ноль не представляет значения.

Свифт — Операторы

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

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

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

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

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

оператор Описание пример
+ Добавляет два операнда А + Б даст 30
Вычитает второй операнд из первого A — B даст -10
* Умножает оба операнда А * Б даст 200
/ Делит числитель на знаменатель Б / у даст 2
% Оператор модуля и остаток от целочисленного / делительного числа B% A даст 0

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

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

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

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

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

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

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

Побитовые операторы работают с битами и выполняют побитовые операции. Таблицы истинности для &, | и ^ следующие:

п Q р & д р | д р ^ д
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Assume A = 60; and B = 13;

In binary format, they will be as follows:

A = 0011 1100

B = 0000 1101

-----------------

A & B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011

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

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

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

SSwift 4 поддерживает следующие операторы присваивания —

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

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

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

оператор Описание пример
Закрытый диапазон (a … b) определяет диапазон от a до b и включает значения a и b. 1 … 5 дает 1, 2, 3, 4 и 5
Полуоткрытый диапазон (a .. <b) определяет диапазон от a до b, но не включает b. 1 .. <5 дает 1, 2, 3 и 4
Односторонний диапазон

a…, определяет диапазон, который проходит от a до конца элементов

… A, определяет диапазон, начиная от начала до

1… дает 1, 2,3… конец элементов

… 2 дает начало… 1,2

a…, определяет диапазон, который проходит от a до конца элементов

… A, определяет диапазон, начиная от начала до

1… дает 1, 2,3… конец элементов

… 2 дает начало… 1,2

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

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

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

Приоритет операторов

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

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

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

оператор Описание пример
Основные операторы выражений () []. expr ++ expr— слева направо
Унарные операторы

* & + -! ~ ++ expr —expr

* /%

+ —

>> <<

<> <=> =

==! =

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

&

^

|

&&

||

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

* & + -! ~ ++ expr —expr

* /%

+ —

>> <<

<> <=> =

==! =

&

^

|

&&

||

Свифт — Принятие решений

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

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

Принятие решения

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

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

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

2 если … еще заявление

За оператором if может следовать необязательный оператор else, который выполняется, когда логическое выражение имеет значение false.

3 if … else if … else Заявление

За оператором if может следовать необязательный оператор else if … else, который очень полезен для проверки различных условий, используя единственный оператор if … else if.

4 вложенные операторы if

Вы можете использовать один оператор if или else if внутри другого оператора if или else if.

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

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

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

За оператором if может следовать необязательный оператор else, который выполняется, когда логическое выражение имеет значение false.

За оператором if может следовать необязательный оператор else if … else, который очень полезен для проверки различных условий, используя единственный оператор if … else if.

Вы можете использовать один оператор if или else if внутри другого оператора if или else if.

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

? : Оператор

Мы накрыли условного оператора? : в предыдущей главе, которая может быть использована для замены операторов if … else . Он имеет следующую общую форму —

Exp1 ? Exp2 : Exp3;

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

Значение? Выражение определяется следующим образом: Exp1 оценивается. Если это правда, то Exp2 оценивается и становится значением целого? выражение. Если Exp1 имеет значение false, то Exp3 оценивается, и его значение становится значением выражения.

Свифт — Петли

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

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

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

петли

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

Sr.No Тип и описание петли
1 для в

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

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

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

3 повторить … пока цикл

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

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

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

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

Заявления о контроле цикла

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

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

Sr.No Контрольное заявление и описание
1 продолжить заявление

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

2 заявление о нарушении

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

3 заявление о падении

Оператор fallthrough имитирует поведение переключателя Swift 4 на C-style.

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

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

Оператор fallthrough имитирует поведение переключателя Swift 4 на C-style.

Свифт — Струны

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

Создать строку

Вы можете создать строку либо используя строковый литерал, либо создав экземпляр класса String следующим образом:

Live Demo

// String creation using String literal
var stringA = "Hello, Swift 4!"
print( stringA )

// String creation using String instance
var stringB = String("Hello, Swift 4!")
print( stringB )

//Multiple line string

let stringC = """
Hey this is a
example of multiple Line
string by tutorialsPoint 

"""
print(stringC)

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

Hello, Swift 4!
Hello, Swift 4!
Hey this is a
example of multiple Line
string by tutorialsPoint

Пустой строки

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

Live Demo

// Empty string creation using String literal
var stringA = ""

if stringA.isEmpty {
   print( "stringA is empty" )
} else {
   print( "stringA is not empty" )
}

// Empty string creation using String instance
let stringB = String()

if stringB.isEmpty {
   print( "stringB is empty" )
} else {
   print( "stringB is not empty" )
}

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

stringA is empty
stringB is empty

Строковые Константы

Вы можете указать, может ли ваша строка быть изменена (или видоизменена), присваивая ее переменной, или она будет постоянной, присваивая ее константе, используя ключевое слово let, как показано ниже —

// stringA can be modified
var stringA = "Hello, Swift 4!"
stringA + = "--Readers--"
print( stringA )

// stringB can not be modified
let stringB = String("Hello, Swift 4!")
stringB + = "--Readers--"
print( stringB )

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

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

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

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

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

Live Demo

var varA = 20
let constA = 100
var varC:Float = 20.0

var stringA = "\(varA) times \(constA) is equal to \(varC * 100)"
print( stringA )

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

20 times 100 is equal to 2000.0

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

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

Live Demo

let constA = "Hello,"
let constB = "World!"

var stringA = constA + constB
print( stringA )

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

Hello,World!

Длина строки

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

Live Demo

var varA = "Hello, Swift 4!"

print( "\(varA), length is \((varA.count))" )

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

Hello, Swift 4!, length is 15

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

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

Live Demo

var varA = "Hello, Swift 4!"
var varB = "Hello, World!"

if varA == varB {
   print( "\(varA) and \(varB) are equal" )
} else {
   print( "\(varA) and \(varB) are not equal" )
}

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

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

Итерация строки

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

Live Demo

for chars in "ThisString" {
   print(chars, terminator: " ")
}

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

T h i s S t r i n g

Юникод Строки

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

Live Demo

var unicodeString = "Dog???"

print("UTF-8 Codes: ")
for code in unicodeString.utf8 {
   print("\(code) ")
}

print("\n")

print("UTF-16 Codes: ")
for code in unicodeString.utf16 {
   print("\(code) ")
}

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

UTF-8 Codes: 
68 
111 
103 
63 
63 
63 


UTF-16 Codes: 
68 
111 
103 
63 
63 
63 

Строковые функции и операторы

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

Sr.No Функции / Операторы и Цель
1

пустой

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

2

hasPrefix (префикс: строка)

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

3

hasSuffix (суффикс: строка)

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

4

toInt ()

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

5

кол()

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

6

utf8

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

7

utf16

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

8

unicodeScalars

Свойство возвращать скалярное представление строки в Юникоде.

9

+

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

10

+ =

Оператор для добавления строки или символа к существующей строке.

11

==

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

12

<

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

13

STARTINDEX

Получить значение по начальному индексу строки.

14

ENDINDEX

Получить значение в конце индекса строки.

15

индексы

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

16

вставить («Значение», в: положение)

Чтобы вставить значение в позиции.

17

удалить (в: позиции)

removeSubrange (диапазон)

удалить значение в позиции или удалить диапазон значений из строки.

18

негативы ()

возвращает обратную строку

пустой

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

hasPrefix (префикс: строка)

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

hasSuffix (суффикс: строка)

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

toInt ()

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

кол()

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

utf8

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

utf16

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

unicodeScalars

Свойство возвращать скалярное представление строки в Юникоде.

+

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

+ =

Оператор для добавления строки или символа к существующей строке.

==

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

<

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

STARTINDEX

Получить значение по начальному индексу строки.

ENDINDEX

Получить значение в конце индекса строки.

индексы

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

вставить («Значение», в: положение)

Чтобы вставить значение в позиции.

удалить (в: позиции)

removeSubrange (диапазон)

удалить значение в позиции или удалить диапазон значений из строки.

негативы ()

возвращает обратную строку

Свифт — Персонажи

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

Live Demo

let char1: Character = "A"
let char2: Character = "B"

print("Value of char1 \(char1)")
print("Value of char2 \(char2)")

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

Value of char1 A
Value of char2 B

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

// Following is wrong in Swift 4
let char: Character = "AB"

print("Value of char \(char)")

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

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

// Following is wrong in Swift 4
let char1: Character = ""
var char2: Character = ""

print("Value of char1 \(char1)")
print("Value of char2 \(char2)")

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

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

Live Demo

for ch in "Hello" {
   print(ch)
}

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

H
e
l
l
o

Конкатенация строк с символами

В следующем примере показано, как персонаж Swift 4 можно объединить со строкой Swift 4.

Live Demo

var varA:String = "Hello "
let varB:Character = "G"

varA.append( varB )

print("Value of varC = \(varA)")

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

Value of varC = Hello G

Swift — Массивы

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

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

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

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

var someArray = [SomeType]()

Вот синтаксис для создания массива заданного размера a * и инициализации его значением —

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, и так далее. В следующем примере показано, как создавать, инициализировать и обращаться к массивам:

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

var someVar = someInts[0]
print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "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 () или оператор присваивания (+ =), чтобы добавить новый элемент в конец массива. Посмотрите на следующий пример. Здесь мы изначально создаем пустой массив, а затем добавляем новые элементы в тот же массив —

Live Demo

var someInts = [Int]()

someInts.append(20)
someInts.append(30)
someInts += [40]

var someVar = someInts[0]

print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "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

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

Live Demo

var someInts = [Int]()

someInts.append(20)
someInts.append(30)
someInts += [40]

// Modify last element
someInts[2] = 50

var someVar = someInts[0]

print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "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

Итерация по массиву

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

Live Demo

var someStrs = [String]()

someStrs.append("Apple")
someStrs.append("Amazon")
someStrs += ["Google"]
for item in someStrs {
   print(item)
}

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

Apple
Amazon
Google

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

Live Demo

var someStrs = [String]()

someStrs.append("Apple")
someStrs.append("Amazon")
someStrs += ["Google"]

for (index, item) in someStrs.enumerated() {
   print("Value at index = \(index) is \(item)")
}

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

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

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

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

var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)

var intsC = intsA + intsB
for item in intsC {
   print(item)
}

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

2
2
1
1
1

Свойство графа

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

var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)

var intsC = intsA + intsB

print("Total items in intsA = \(intsA.count)")
print("Total items in intsB = \(intsB.count)")
print("Total items in intsC = \(intsC.count)")

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

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

Пустая недвижимость

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

var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = [Int]()

print("intsA.isEmpty = \(intsA.isEmpty)")
print("intsB.isEmpty = \(intsB.isEmpty)")
print("intsC.isEmpty = \(intsC.isEmpty)")

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

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

Swift — Наборы

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

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

Тип должен быть хешируемым, чтобы быть сохраненным в наборе. Хеш-значение — это значение Int, равное для равных объектов. Например, если x == y, то x.hashvalue == y.hashvalue .

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

Создание наборов

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

var someSet = Set<Character>()     //Character can be replaced by data type of set.

Доступ и изменение Наборов

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

Метод «count» может использоваться для отображения количества элементов в наборе.

someSet.count        // prints the number of elements

Метод «insert» может использоваться для вставки значений в набор.

someSet.insert("c")   // adds the element to Set.

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

someSet.isEmpty       // returns true or false depending on the set Elements.

Метод «удалить» может быть использован для удаления значения в наборе.

someSet.remove("c")     // removes a element , removeAll() can be used to remove all elements

Метод «содержит» может использоваться для проверки наличия значения в наборе.

someSet.contains("c")     // to check if set contains this value.

Итерация по множеству

Вы можете перебрать набор, используя цикл for-in —

for items in someSet {
   print(someSet)
}

//Swift sets are not in an ordered way, to iterate over a set in ordered way use

for items in someSet.sorted() {
   print(someSet)
}  

Выполнение операций над множествами

Вы можете выполнять основные операции над наборами на быстрых наборах.

Ниже приведены методы выполнения операций над множествами:

  • пересечение
  • союз
  • вычитая
let evens: Set = [10,12,14,16,18]
let odds: Set = [5,7,9,11,13]
let primes = [2,3,5,7]
odds.union(evens).sorted()
// [5,7,9,10,11,12,13,14,16,18]
odds.intersection(evens).sorted()
//[]
odds.subtracting(primes).sorted()
//[9, 11, 13]

Swift — Словари

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

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

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

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

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

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

var someDict = [KeyType: ValueType]()

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

var someDict = [Int: String]()

Вот пример для создания словаря из набора заданных значений —

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

Инициализация на основе последовательности

Swift 4 позволяет вам создавать словарь из массивов (Key-Value Pairs.)

var cities = [“Delhi”,”Bangalore”,”Hyderabad”]

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

var Distance = [2000,10, 620]

Вот пример для создания словаря из набора заданных значений —

let cityDistanceDict = Dictionary(uniqueKeysWithValues: zip(cities, Distance))

Приведенные выше строки кода создадут словарь с городами в качестве ключа и расстоянием в качестве значения —

фильтрация

Swift 4 позволяет фильтровать значения из словаря.

var closeCities = cityDistanceDict.filter { $0.value < 1000 }

Если мы запустим приведенный выше код, наш словарь closeCities будет.

["Bangalore" : 10 , "Hyderabad" : 620]

Группировка словаря

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

var cities = ["Delhi","Bangalore","Hyderabad","Dehradun","Bihar"]

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

var GroupedCities = Dictionary(grouping: cities ) { $0.first! }

Результат приведенного выше кода будет

["D" :["Delhi","Dehradun"], "B" : ["Bengaluru","Bihar"], "H" : ["Hyderabad"]]

Доступ к словарям

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

var someVar = someDict[key]

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

Live Demo

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

print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "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 :), чтобы добавить существующее значение к заданному ключу словаря. Этот метод возвращает необязательное значение типа значения словаря. Вот простой пример —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict.updateValue("New value of one", forKey: 1)
var someVar = someDict[1]

print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "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")

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

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict[1]
someDict[1] = "New value of one"
var someVar = someDict[1]

print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "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, если значение не существовало. Вот простой пример —

Live Demo

var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var removedValue = someDict.removeValue(forKey: 2)

print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "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")

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

Live Demo

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

someDict[2] = nil

print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "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")

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

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

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

for (index, keyValue) in someDict.enumerated() {
   print("Dictionary key \(index) - Dictionary value \(keyValue)")
}

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

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

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

Live Demo

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

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

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

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

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

Live Demo

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

let dictKeys = [Int](someDict.keys)
let dictValues = [String](someDict.values)

print("Print Dictionary Keys")

for (key) in dictKeys {
   print("\(key)")
}
print("Print Dictionary Values")

for (value) in dictValues {
   print("\(value)")
}

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

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

Свойство графа

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

Live Demo

var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]

print("Total items in someDict1 = \(someDict1.count)")
print("Total items in someDict2 = \(someDict2.count)")

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

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

Пустая недвижимость

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

Live Demo

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

print("someDict1 = \(someDict1.isEmpty)")
print("someDict2 = \(someDict2.isEmpty)")
print("someDict3 = \(someDict3.isEmpty)")

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

someDict1 = false
someDict2 = false
someDict3 = true

Swift — Функции

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

  • Объявление функции — сообщает компилятору имя функции, тип возвращаемого значения и параметры.

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

Объявление функции — сообщает компилятору имя функции, тип возвращаемого значения и параметры.

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

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

Определение функции

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

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

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

Синтаксис

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

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

Live Demo

func student(name: String) -> String {
   return name
}

print(student(name: "First Program"))
print(student(name: "About Functions"))

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

First Program
About Functions

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

Давайте предположим, что мы определили функцию с именем display для рассмотрения. Например, для отображения чисел функция с именем функции display отображается сначала с аргументом no1, который содержит целочисленный тип данных. Затем аргумент ‘no1’ присваивается аргументу ‘a’, который в дальнейшем будет указывать на тот же тип данных integer. Теперь аргумент «а» возвращается в функцию. Здесь функция display () будет содержать целочисленное значение и возвращать целочисленные значения при каждом вызове функции.

Live Demo

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

print(display(no1: 100))
print(display(no1: 200))

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

100
200

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

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

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

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

Live Demo

func mult(no1: Int, no2: Int) -> Int {
   return no1*no2
}

print(mult(no1: 2, no2: 20))
print(mult(no1: 3, no2: 15))
print(mult(no1: 4, no2: 30))

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

40
45
120

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

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

Синтаксис

func funcname() -> datatype {
   return datatype
}

Ниже приведен пример с функцией без параметра:

Live Demo

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

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

Alice

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

Функции также используются для возврата значений типа string, integer и float в качестве типов возврата. Чтобы узнать наибольшее и наименьшее число в данном массиве, функция ‘ls’ объявляется с большими и маленькими целочисленными типами данных.

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

Live Demo

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(array: [40,12,-5,78,98])
print("Largest number is: \(num.large) and smallest number is: \(num.small)")

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

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

Функции без возвращаемых значений

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

Live Demo

func sum(a: Int, b: Int) {
   let a = a + b
   let b = a - b
   print(a, b)
}

sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)

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

30 20
50 40
30 24

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

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

Необязательные функции могут принимать две формы: «значение» и «ноль». Мы упомянем «Необязательные» с зарезервированным символом «?» проверить, возвращает ли кортеж значение или нулевое значение.

Live Demo

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(array: [8, -6, 2, 109, 3, 71]) {
   print("min is \(bounds.min) and max is \(bounds.max)")
}

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

min is -6 and max is 109

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

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

Имена локальных параметров

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

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

Здесь номер аргумента семпла func объявлен как внутренняя переменная, так как он доступен внутри функции sample (). Здесь ‘число’ объявлено как локальная переменная, но ссылка на переменную делается вне функции с помощью следующего оператора:

Live Demo

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

sample(number: 1)
sample(number: 2)
sample(number: 3)

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

1
2
3

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

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

Live Demo

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

pow(firstArg:5, secondArg:3)

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

125

Вариативные параметры

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

Live Demo

func vari<N>(members: N...){
   for i in members {
      print(i)
   }
}

vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Swift 4", "Enumerations", "Closures")

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

4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures

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

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

Параметры ввода / вывода в Swift 4 обеспечивают функциональность для сохранения значений параметров, даже если их значения изменяются после вызова функции. В начале определения параметра функции объявляется ключевое слово «inout» для сохранения значений элементов.

Он получает ключевое слово «inout», поскольку его значения передаются «in» в функцию, а его значения доступны и изменяются ее телом функции, и он возвращается «out» из функции, чтобы изменить исходный аргумент.

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

Live Demo

func temp(a1: inout Int, b1: inout Int) {
   let t = a1
   a1 = b1
   b1 = t
}

var no = 2
var co = 10
temp(a1: &no, b1: &co)
print("Swapped values are \(no), \(co)")

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

Swapped values are 10, 2

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

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

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

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

Live Demo

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

print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))

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

2
6

Здесь функция инициализируется с двумя аргументами no1 и no2 как целочисленные типы данных, а ее возвращаемый тип также объявляется как ‘int’

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

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

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

Live Demo

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

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

Swift 4 Functions
Types and its Usage

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

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

Сначала функции передаются с аргументами типа integer, float или string, а затем передаются в функцию как константы или переменные, как указано ниже.

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

Здесь sum — это имя функции, имеющее целочисленные переменные ‘a’ и ‘b’, которое теперь объявлено как переменная для добавления имени функции. Здесь и функция сложения, и сумма имеют одинаковое количество аргументов, объявленных как целочисленный тип данных, а также возвращают целочисленные значения в качестве ссылок.

Live Demo

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

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

Result: 129

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

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

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

func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
   print("Result: \(addition(a, b))")
}
another(sum, 10, 20)

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

Result: 129
Result: 30

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

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

Live Demo

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

let decrem = calcDecrement(forDecrement: 30)
print(decrem())

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

-30

Свифт — Закрытие

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

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

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

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

Синтаксис

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

{
   (parameters) −> return type in
   statements
}

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

Live Demo

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

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

Welcome to Swift Closures

Следующее закрытие принимает два параметра и возвращает значение Bool —

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

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

Live Demo

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

let result = divide(200, 20)
print (result)

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

10

Выражения в замыканиях

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

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

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

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

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

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

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

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

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

Live Demo

func ascend(s1: String, s2: String) -> Bool {
   return s1 > s2
}

let stringcmp = ascend(s1: "Swift 4", s2: "great")
print (stringcmp)

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

true

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

Синтаксис выражения закрытия использует —

  • постоянные параметры,
  • переменные параметры и
  • входные параметры.

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

Live Demo

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

let digits = sum(10, 20)
print(digits)

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

30

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

Неявные возвраты из одного выражения

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

Для возврата оператора Single expression в замыканиях выражений ключевое слово return в его части объявления опущено.

Live Demo

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

print(descending)
print(ascending)

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

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

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

Закрытия известного типа

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

Live Demo

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

let digits = sub(10, 20)
print(digits)

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

-10

Объявление сокращенных имен аргументов как замыканий

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

Live Demo

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

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

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

200

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

Список аргументов замыканий опускается в разделе определения, когда мы представляем сокращенные имена аргументов внутри выражений замыканий. На основе типа функции будут получены сокращенные имена аргументов. Поскольку сокращенный аргумент определен в теле выражения, ключевое слово «in» опущено.

Замыкания как операторные функции

Swift 4 обеспечивает простой способ доступа к членам, просто предоставляя функции оператора в виде замыканий. В предыдущих примерах ключевое слово «Bool» используется для возврата либо «true», когда строки равны, в противном случае возвращается «false».

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

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(<)
print(asc)

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

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

Закрытия как трейлеры

Передача последнего аргумента функции в выражение замыкания объявляется с помощью ‘Trailing 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 
}
print(stletters)

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

[NO, EA, WE, SO]

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

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

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

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

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

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

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

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

Live Demo

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 100
   func decrementer() -> Int {
      overallDecrement -= total
      print(overallDecrement)
      return overallDecrement
   }
   return decrementer
}

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

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

82
64
46

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

Несмотря на то, что функция decmenter () не имеет аргументов, закрытие по умолчанию ссылается на переменные «totalDecrement» и «total» путем захвата существующих значений. Копия значений для указанных переменных сохраняется с новой функцией decmenter (). Swift 4 обрабатывает функции управления памятью, выделяя и освобождая области памяти, когда переменные не используются.

Свифт — Перечисления

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

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

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

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

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

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

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

Начальное значение члена определяется с помощью инициализаторов enum.

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

Синтаксис

Перечисления вводятся с ключевым словом enum и помещают все их определения в пару фигурных скобок —

enum enumname {
   // enumeration values are described here
}

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

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

пример

Live Demo

enum names {
   case Swift
   case Closures
}

var lang = names.Closures
lang = .Closures

switch lang {
   case .Swift:
      print("Welcome to Swift")
   case .Closures:
      print("Welcome to Closures")
   default:
      print("Introduction")
}

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

Welcome to Closures

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

var weekDay = DaysofaWeek.Sunday 

Здесь имя перечисления ‘DaysofaWeek’ присваивается переменной дней недели. Воскресенье. Он сообщает компилятору, что тип данных, относящийся к Sunday, будет присвоен последующим членам enum этого конкретного класса. Как только тип данных элемента enum определен, к членам можно получить доступ путем передачи значений и дальнейших вычислений.

Перечисление с оператором Switch

Оператор Swift 4 «Switch» также следует за множественным выбором. Доступ к одной переменной возможен в определенное время на основе указанного условия. Регистр по умолчанию в операторе switch используется для отлова неуказанных случаев.

Live Demo

enum Climate {
   case India
   case America
   case Africa
   case Australia
}

var season = Climate.America
season = .America
switch season {
   case .India:
      print("Climate is Hot")
   case .America:
      print("Climate is Cold")
   case .Africa:
      print("Climate is Moderate")
   case .Australia:
      print("Climate is Rainy")
   
}

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

Climate is Cold

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

Перечисление может быть далее классифицировано в связанные значения и необработанные значения.

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

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

Перечисление со связанными значениями

Live Demo

enum Student {
   case Name(String)
   case Mark(Int,Int,Int)
}

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

switch studMarks {
   case .Name(let studName):
      print("Student name is: \(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      print("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
}

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

Student Marks are: 98,97,95.

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

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

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

Перечисление с необработанными значениями

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

Live Demo

enum Month: Int {
   case January = 1, February, March, April, May, June, July, August,
      September, October, November, December
}

let yearMonth = Month.May.rawValue
print("Value of the Month is: \(yearMonth).")

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

Value of the Month is: 5.

Свифт — Конструкции

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

В отличие от 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
}

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

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

Live Demo

struct studentMarks {
   var mark1 = 100
   var mark2 = 200
   var mark3 = 300
}

let marks = studentMarks()
print("Mark1 is \(marks.mark1)")
print("Mark2 is \(marks.mark2)")
print("Mark3 is \(marks.mark3)")

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

Mark1 is 100
Mark2 is 200
Mark3 is 300

Доступ к оценкам учащихся осуществляется по структуре «studentMarks». Элементы структуры инициализируются как mark1, mark2, mark3 со значениями целочисленного типа. Затем структура studentMarks () передается метке «mark» с ключевым словом «let». В дальнейшем «отметки» будут содержать значения элементов структуры. Теперь значения печатаются путем доступа к значениям элементов структуры с помощью «.» с его инициализированными именами.

Live Demo

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

print(aStruct.mark)      // 98
print(bStruct.mark)      // 97

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

98
97

Лучшие практики использования конструкций

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

Нужно иметь структуры

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

  • Копировать инкапсулированные данные и связанные с ними свойства по «значениям», а не «ссылкам».

  • Структура для «Копировать» и «Ссылка».

Инкапсулировать простые значения данных.

Копировать инкапсулированные данные и связанные с ними свойства по «значениям», а не «ссылкам».

Структура для «Копировать» и «Ссылка».

Структуры в Swift 4 передают своих членов со своими значениями, а не по ссылкам.

Live Demo

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)
print(marks.mark1)
print(marks.mark2)
print(marks.mark3)

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

98
96
100

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

Live Demo

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)

print(fail.mark1)
print(fail.mark2)
print(fail.mark3)

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

34
42
13

Структура ‘markStruct’ определяется в первую очередь ее членами mark1, mark2 и mark3. Теперь переменные классов-членов инициализируются для хранения целочисленных значений. Затем копии членов структуры создаются с ключевым словом «self». Как только копия элементов структуры создана, структурный блок с его параметрами marks передается в переменную ‘marks’, которая теперь будет содержать оценки студентов. Затем метки печатаются как 98, 96, 100. Следующий шаг для тех же самых элементов структуры, другой экземпляр с именем ‘fail’ используется для указания одинаковых элементов структуры разными метками. Затем результаты теперь печатаются как 34, 42, 13. Это ясно объясняет, что структуры будут иметь копию переменных-членов, а затем будут передавать элементы в их предстоящие функциональные блоки.

Свифт — Классы

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

Преимущества занятия

  • Наследование приобретает свойства одного класса другому классу

  • Приведение типов позволяет пользователю проверять тип класса во время выполнения

  • Деинициализаторы заботятся об освобождении ресурсов памяти

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

Наследование приобретает свойства одного класса другому классу

Приведение типов позволяет пользователю проверять тип класса во время выполнения

Деинициализаторы заботятся об освобождении ресурсов памяти

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

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

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

Синтаксис

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

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

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

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

let studrecord = student()

пример

Live Demo

class MarksStruct {
   var mark: Int
   init(mark: Int) {
      self.mark = mark
   }
}

class studentMarks {
   var mark = 300
}

let marks = studentMarks()
print("Mark is \(marks.mark)")

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

Mark is 300

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

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

Live Demo

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()
print("Mark1 is \(marks.mark1)")
print("Mark2 is \(marks.mark2)")
print("Mark3 is \(marks.mark3)")

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

Mark1 is 300
Mark2 is 400
Mark3 is 900

Операторы идентификации классов

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

Идентичен операторам Не идентичен операторам
Оператор используется (===) Оператор используется (! ==)
Возвращает true, когда две константы или переменные указывают на один и тот же экземпляр Возвращает true, когда две константы или переменные указывают на другой экземпляр

Live Demo

class SampleClass: Equatable {
   let myProperty: String
   init(s: String) {
      myProperty = s
   }
}

func ==(lhs: SampleClass, rhs: SampleClass) -> Bool {
   return lhs.myProperty == rhs.myProperty
}

let spClass1 = SampleClass(s: "Hello")
let spClass2 = SampleClass(s: "Hello")

spClass1 === spClass2 // false
print("\(spClass1)")

spClass1 !== spClass2 // true
print("\(spClass2)")

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

main.SampleClass
main.SampleClass

Свифт — Недвижимость

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

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

Сохраненная собственность Компьютерная собственность
Сохраняйте значения констант и переменных как экземпляр Рассчитать значение, а не хранить значение
Предоставляется классами и структурами Предоставляется классами, перечислениями и структурами

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

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

Сохраненные Свойства

Swift 4 представляет концепцию Stored Property для хранения экземпляров констант и переменных. Хранимые свойства констант определяются ключевым словом ‘let’, а Хранимые свойства переменных определяются ключевым словом ‘var’.

  • Во время определения хранимое свойство предоставляет «значение по умолчанию»
  • Во время инициализации пользователь может инициализировать и изменить начальные значения

Live Demo

struct Number {
   var digits: Int
   let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.pi)")

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

67
3.1415

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

let pi = 3.1415

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

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

Live Demo

struct Number {
   var digits: Int
   let numbers = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.numbers)")
n.numbers = 8.7

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

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

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

Ленивое Хранение Собственности

Swift 4 предоставляет гибкое свойство, называемое «Lazy Stored Property», где он не будет вычислять начальные значения, когда переменная инициализируется в первый раз. Модификатор ‘lazy’ используется перед объявлением переменной, чтобы иметь его в качестве сохраненного свойства lazy.

Lazy Properties используются —

  • Отложить создание объекта.
  • Когда свойство зависит от других частей класса, которые еще не известны

Live Demo

class sample {
   lazy var no = number()    // `var` declaration is required.
}

class number {
   var name = "Swift 4"
}

var firstsample = sample()
print(firstsample.no.name)

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

Swift 4

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

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

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

Вычисленные свойства

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

Live Demo

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()
print(result.middle)
result.middle = (0.0, 10.0)

print(result.no1)
print(result.no2)

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

(150.0, 75.0)
-150.0
-65.0

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

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

Свойство только для чтения в вычисляемом свойстве определяется как свойство с геттером, но без сеттера. Он всегда используется для возврата значения. Доступ к переменным осуществляется через «.» Синтаксис, но нельзя установить другое значение.

Live Demo

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 4 Properties"
movie.duration = 3.09

print(movie.metaInfo["head"]!)
print(movie.metaInfo["duration"]!)

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

Swift 4 Properties
3.09

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

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

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

  • Перед сохранением значения — завещание

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

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

Перед сохранением значения — завещание

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

Когда свойство установлено в инициализаторе, будет установлено, и наблюдатели didset не могут быть вызваны.

Live Demo

class Samplepgm {
   var counter: Int = 0 {
      willSet(newTotal){
         print("Total Counter is: \(newTotal)")
      }
      
      didSet {
         if counter > oldValue {
            print("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

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

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

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

Тип недвижимости

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

Синтаксис

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
   }
}

Запрос и установка свойств

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

Live Demo

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
print(stud1Mark1.InternalMarks)

stud1Mark2.InternalMarks = 87
print(stud1Mark2.InternalMarks)

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

97
87

Свифт — Методы

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

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

В языке Swift 4 доступ к экземплярам Classes, Structures и Enumeration осуществляется через методы экземпляра.

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

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

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

Синтаксис

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

пример

Live Demo

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() {
      print("Result is: \(tot(c: 20))")
      print("Result is: \(tot(c: 50))")
   }
}
let pri = calculations(a: 600, b: 300)
pri.result()

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

Result is: 880
Result is: 850

Вычисления класса определяют два метода экземпляра —

  • init () определен, чтобы добавить два числа a и b и сохранить их в результате ‘res’
  • tot () используется, чтобы вычесть ‘res’ из передачи значения ‘c’

Наконец, для печати расчетов используются методы со значениями для a и b. Методы экземпляра доступны с помощью «.» точечный синтаксис

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

Функции Swift 4 описывают как локальные, так и глобальные объявления для своих переменных. Точно так же соглашения об именах Swift 4 Methods также напоминают Objective C. Но характеристики локальных и глобальных объявлений имен параметров различаются для функций и методов. Первый параметр в Swift 4 именуется предлогами как «with», «for» и «by» для простого доступа к соглашениям об именах.

Swift 4 обеспечивает гибкость методов, объявляя имя первого параметра в качестве локальных имен параметров, а оставшиеся имена параметров — как глобальные имена параметров. Здесь ‘no1’ объявляется методами Swift 4 как локальные имена параметров. «no2» используется для глобальных объявлений и доступен через программу.

Live Demo

class division {
   var count: Int = 0
   func incrementBy(no1: Int, no2: Int) {
      count = no1 / no2
      print(count)
   }
}

let counter = division()
counter.incrementBy(no1: 1800, no2: 3)
counter.incrementBy(no1: 1600, no2: 5)
counter.incrementBy(no1: 11000, no2: 3)

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

600
320
3666

Имя внешнего параметра с символом # и _

Несмотря на то, что методы Swift 4 предоставляют первые имена параметров для локальных объявлений, пользователь может изменить имена параметров с локальных на глобальные объявления. Это можно сделать, добавив префикс «#» к имени первого параметра. Таким образом, к первому параметру можно получить глобальный доступ по всем модулям.

Когда пользователю необходимо получить доступ к последующим именам параметров с помощью внешнего имени, имя метода переопределяется с помощью символа «_».

Live Demo

class multiplication {
   var count: Int = 0
   func incrementBy(no1: Int, no2: Int) {
      count = no1 * no2
      print(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

Собственная собственность в методах

Методы имеют неявное свойство, известное как «self», для всех экземпляров определенного типа. Свойство «Self» используется для ссылки на текущие экземпляры для его определенных методов.

Live Demo

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
      print("Inside Self Block: \(res)")
   }
   
   func tot(c: Int) -> Int {
      return res - c
   }
   
   func result() {
      print("Result is: \(tot(c: 20))")
      print("Result is: \(tot(c: 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 4 языковые структуры и перечисления относятся к типам значений, которые не могут быть изменены его методами экземпляра. Тем не менее, язык Swift 4 обеспечивает гибкость для изменения типов значений путем «мутации» поведения. Mutate внесет любые изменения в методы экземпляра и вернется к исходной форме после выполнения метода. Также с помощью свойства «self» создается новый экземпляр для его неявной функции, который заменит существующий метод после его выполнения.

Live Demo

struct area {
   var length = 1
   var breadth = 1
   
   func area() -> Int {
      return length * breadth
   }
   mutating func scaleBy(res: Int) {
      length *= res
      breadth *= res
      print(length)
      print(breadth)
   }
}

var val = area(length: 3, breadth: 5)
val.scaleBy(res: 3)
val.scaleBy(res: 30)
val.scaleBy(res: 300)

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

9
15
270
450
81000
135000

Собственная собственность для метода мутации

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

Live Demo

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
      print(length)
      print(breadth)
   }
}

var val = area(length: 3, breadth: 5)
val.scaleBy(res: 13)

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

39
65

Методы типа

Когда вызывается конкретный экземпляр метода, он вызывается как метод Instance; и когда метод вызывает конкретный тип метода, он называется «Методы типа». Методы типов для классов определяются ключевым словом func, а методы типов структур и перечислений определяются ключевым словом static перед ключевым словом func.

Методы типа вызываются и доступны с помощью ‘.’ синтаксис, где вместо вызова конкретного экземпляра вызывается весь метод.

Live Demo

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(number: -35)
let num = absno.abs(number: -5)

print(no)
print(num)

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

35
5

Swift — Подписки

Доступ к элементам-членам коллекции, последовательности и списка в классах, структурах и перечислениях осуществляется с помощью индексов. Эти индексы используются для хранения и извлечения значений с помощью индекса. Доступ к элементам массива осуществляется с помощью someArray [index], а к его последующим элементам-членам в экземпляре Dictionary можно обращаться как someDicitonary [key].

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

Синтаксис объявления нижнего индекса и его использование

Давайте вспомним вычисленные свойства. Индексы также следуют тому же синтаксису, что и синтаксис вычисляемых свойств. При запросе экземпляров типов индексы пишутся в квадратных скобках, за которыми следует имя экземпляра. Синтаксис нижнего индекса соответствует той же структуре синтаксиса, что и синтаксис «метод экземпляра» и «вычисляемое свойство». Ключевое слово «subscript» используется для определения подписок, и пользователь может указать один или несколько параметров с их типами возвращаемых данных. У нижних индексов могут быть свойства для чтения и записи или только для чтения, а экземпляры хранятся и извлекаются с помощью свойств «getter» и «setter», как у вычисляемых свойств.

Синтаксис

subscript(index: Int) −> Int {
   get {
      // used for subscript value declarations
   }
   set(newValue) {
      // definitions are written here
   }
}

Example1

Live Demo

struct subexample {
   let decrementer: Int
   subscript(index: Int) -> Int {
      return decrementer / index
   }
}
let division = subexample(decrementer: 100)

print("The number is divisible by \(division[9]) times")
print("The number is divisible by \(division[2]) times")
print("The number is divisible by \(division[3]) times")
print("The number is divisible by \(division[5]) times")
print("The number is divisible by \(division[7]) times")

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

The number is divisible by 11 times
The number is divisible by 50 times
The number is divisible by 33 times
The number is divisible by 20 times
The number is divisible by 14 times

Example2

Live Demo

class daysofaweek {
   private var days = ["Sunday", "Monday", "Tuesday", "Wednesday",
      "Thursday", "Friday", "saturday"]
   subscript(index: Int) -> String {
      get {
         return days[index]
      }
      set(newValue) {
         self.days[index] = newValue
      }
   }
}
var p = daysofaweek()

print(p[0])
print(p[1])
print(p[2])
print(p[3])

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

Sunday
Monday
Tuesday
Wednesday

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

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

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

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

print("\(mat[0,0])")

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

1.0

Индекс Swift 4 поддерживает один параметр для нескольких объявлений параметров для соответствующих типов данных. Программа объявляет структуру Matrix как матрицу 2 * 2-мерного массива для хранения типов данных Double. Параметр Matrix вводится с типами данных 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 — Наследование

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

  • Подкласс — когда класс наследует свойства, методы и функции от другого класса, он называется подклассом

  • Суперкласс — Класс, содержащий свойства, методы и функции для наследования других классов от самого себя, называется суперклассом

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

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

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

Базовый класс

Класс, который не наследует методы, свойства или функции от другого класса, называется «Базовый класс».

Live Demo

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 4"
let mark1 = 98
let mark2 = 89
let mark3 = 76

print(stname)
print(mark1)
print(mark2)
print(mark3)

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

Swift 4
98
89
76

Класс с именем класса StudDetails определяется здесь как базовый класс, который содержит имя ученика, а три предмета помечаются как mark1, mark2 и mark3. Ключевое слово «let» используется для инициализации значения для базового класса, а значение базового класса отображается на площадке с помощью функции «print».

Подкласс

Акт базирования нового класса на существующем классе определяется как «Подкласс». Подкласс наследует свойства, методы и функции своего базового класса. Чтобы определить подкласс ‘:’ используется перед именем базового класса

class StudDetails {
   var mark1: Int;
   var mark2: Int;
   
   init(stm1:Int, results stm2:Int) {
      mark1 = stm1;
      mark2 = stm2;
   }
   func print() {
      print("Mark1:\(mark1), Mark2:\(mark2)")
   }
}

class display : StudDetails {
   init() {
      super.init(stm1: 93, results: 89)
   }
}

let marksobtained = display()
marksobtained.print()

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

Mark1:93, Mark2:89

Класс ‘StudDetails’ определяется как суперкласс, в котором объявляются оценки учащихся, а подкласс ‘display’ используется для наследования оценок от своего суперкласса. Подкласс определяет оценки учащихся и вызывает метод print () для отображения оценки учащихся.

Переопределение

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

Доступ к методам, свойствам и подпискам суперкласса

Ключевое слово ‘super’ используется в качестве префикса для доступа к методам, свойствам и индексам, объявленным в суперклассе.

Переопределение Доступ к методам, свойствам и подпискам
методы super.somemethod ()
свойства super.someProperty ()
Нижние индексы супер [someIndex]

Переопределение методов

Унаследованные методы экземпляра и типа могут быть переопределены ключевым словом ‘override’ для наших методов, определенных в нашем подклассе. Здесь print () переопределяется в подклассе для доступа к свойству типа, указанному в суперклассе print (). Также новый экземпляр суперкласса cricket () создается как cricinstance.

class cricket {
   func print() {
      print("Welcome to Swift 4 Super Class")
   }
}

class tennis: cricket {
   override func print() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.print()

let tennisinstance = tennis()
tennisinstance.print()

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

Welcome to Swift Super Class
Welcome to Swift Sub Class

Переопределение собственности

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

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

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

Это можно сделать двумя способами —

  • Когда setter определен для переопределяющего свойства, пользователь также должен определить getter.

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

Когда setter определен для переопределяющего свойства, пользователь также должен определить getter.

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

Live Demo

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
print("Radius \(rect.area)")

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

Radius of rectangle for 25.0  is now overridden as 3

Переопределение наблюдателей за недвижимостью

Когда для унаследованного свойства необходимо добавить новое свойство, в Swift 4 вводится понятие «переопределение свойства». Оно уведомляет пользователя об изменении значения унаследованного свойства. Но переопределение не применимо для унаследованных константных хранимых свойств и унаследованных вычисляемых свойств только для чтения.

Live Demo

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
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("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

Конечное свойство для предотвращения переопределения

Когда пользователю не нужно, чтобы другие обращались к методам суперкласса, свойствам или подпискам, Swift 4 вводит свойство final для предотвращения переопределения. Как только свойство ‘final’ объявлено, индексы не позволят переопределить методы, свойства и его индексы суперкласса. Не существует условия, чтобы иметь свойство ‘final’ в ‘super class’. Когда объявлено свойство ‘final’, пользователю запрещается создавать дополнительные подклассы.

Live Demo

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
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("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

Поскольку суперкласс объявлен как ‘final’, а его типы данных также объявлены как ‘final’, программа не разрешит создавать подклассы дальше и будет выдавать ошибки.

Swift — инициализация

Классы, структуры и перечисления, однажды объявленные в Swift 4, инициализируются для подготовки экземпляра класса. Начальное значение инициализируется для сохраненного свойства, а также для новых экземпляров. Инициализируются значения, чтобы продолжить работу. Ключевое слово для создания функции инициализации выполняется методом init (). Инициализатор Swift 4 отличается от Objective-C тем, что он не возвращает никаких значений. Его функция заключается в проверке инициализации вновь созданных экземпляров перед их обработкой. Swift 4 также предоставляет процесс «деинициализации» для выполнения операций управления памятью после освобождения экземпляров.

Роль инициализатора для сохраненных свойств

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

  • Создать начальное значение.

  • Чтобы назначить значение свойства по умолчанию в определении свойства.

  • Для инициализации экземпляра для определенного типа данных используется init (). Внутри функции init () аргументы не передаются.

Создать начальное значение.

Чтобы назначить значение свойства по умолчанию в определении свойства.

Для инициализации экземпляра для определенного типа данных используется init (). Внутри функции init () аргументы не передаются.

Синтаксис

init() {
   //New Instance initialization goes here
}

пример

Live Demo

struct rectangle {
   var length: Double
   var breadth: Double
   init() {
      length = 6
      breadth = 12
   }
}

var area = rectangle()
print("area of rectangle is \(area.length*area.breadth)")

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

area of rectangle is 72.0

Здесь структура ‘rectangle’ инициализируется с длиной и шириной элементов как ‘Double’ типы данных. Метод Init () используется для инициализации значений для вновь создаваемых элементов длины и двойника. Площадь прямоугольника вычисляется и возвращается путем вызова функции прямоугольника.

Установка значений свойств по умолчанию

Язык Swift 4 предоставляет функцию Init () для инициализации значений сохраненных свойств. Кроме того, пользователь может инициализировать значения свойств по умолчанию при объявлении членов класса или структуры. Когда свойство принимает одно и то же значение во всей программе, мы можем объявить его только в разделе объявления, а не инициализировать его в init (). Установка значений свойств по умолчанию позволяет пользователю, когда наследование определено для классов или структур.

Live Demo

struct rectangle {
   var length = 6
   var breadth = 12
}

var area = rectangle()
print("area of rectangle is \(area.length*area.breadth)")

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

area of rectangle is 72

Здесь вместо объявления длины и ширины в init () значения инициализируются в самом объявлении.

Инициализация параметров

В языке Swift 4 пользователь имеет возможность инициализировать параметры как часть определения инициализатора с помощью init ().

Live Demo

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)
print("area is: \(ar.area)")

let are = Rectangle(fromLeng: 36, fromBread: 12)
print("area is: \(are.area)")

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

area is: 72.0
area is: 432.0

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

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

Чтобы преодолеть это, Swift 4 вводит автоматическое внешнее имя для каждого параметра в init (). Это автоматическое внешнее имя эквивалентно локальному имени, записанному перед каждым параметром инициализации.

Live Demo

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)
print("Days of a Week is: \(week.sunday)")
print("Days of a Week is: \(week.monday)")
print("Days of a Week is: \(week.tuesday)")

let weekdays = Days(daysofaweek: 4)
print("Days of a Week is: \(weekdays.sunday)")
print("Days of a Week is: \(weekdays.monday)")
print("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

Параметры без внешних имен

Когда внешнее имя не требуется для инициализации, подчеркивание ‘_’ используется для переопределения поведения по умолчанию.

Live Demo

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)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

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

area is: 180.0
area is: 370.0
area is: 110.0

Необязательные типы недвижимости

Когда хранимое свойство в каком-то экземпляре не возвращает никакого значения, это свойство объявляется с необязательным типом, указывающим, что для этого конкретного типа не возвращается «никакого значения». Когда сохраненное свойство объявляется как «необязательное», оно автоматически инициализирует значение «nil» во время самой инициализации.

Live Demo

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)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

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

area is: Optional(180.0)
area is: Optional(370.0)
area is: Optional(110.0)

Изменение свойств константы во время инициализации

Инициализация также позволяет пользователю изменять значение постоянного свойства. Во время инициализации свойство класса позволяет его экземплярам класса изменяться суперклассом, а не подклассом. Рассмотрим, к примеру, в предыдущей программе «длина» объявлена ​​как «переменная» в основном классе. Приведенная ниже программная переменная «length» модифицируется как «постоянная» переменная.

Live Demo

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)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

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

area is: Optional(180.0)
area is: Optional(370.0)
area is: Optional(110.0)

Инициализаторы по умолчанию

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

Live Demo

class defaultexample {
   var studname: String?
   var stmark = 98
   var pass = true
}
var result = defaultexample()

print("result is: \(result.studname)")
print("result is: \(result.stmark)")
print("result is: \(result.pass)")

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

result is: nil
result is: 98
result is: true

Вышеуказанная программа определена с именем класса как «defaultexample». Три функции-члена по умолчанию инициализируются как ‘studname?’ хранить значения ‘nil’, ‘stmark’ как 98 и ‘pass’ как логическое значение ‘true’. Аналогично значения членов в классе могут быть инициализированы как значения по умолчанию перед обработкой типов членов класса.

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

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

Live Demo

struct Rectangle {
   var length = 100.0, breadth = 200.0
}
let area = Rectangle(length: 24.0, breadth: 32.0)

print("Area of rectangle is: \(area.length)")
print("Area of rectangle is: \(area.breadth)")

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

Area of rectangle is: 24.0
Area of rectangle is: 32.0

Структуры инициализируются по умолчанию для их функций членства во время инициализации для «length» как «100.0» и «width» как «200.0». Но значения переопределяются при обработке переменных длины и ширины как 24.0 и 32.0.

Делегирование инициализатора для типов значений

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

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()
print("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))
print("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))
print("student result is: \(set3.average.m1, set3.average.m2)
\(set3.result.mark1, set3.result.mark2)")

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

(0.0,0.0) (0.0,0.0)
(2.0,2.0) 5.0,5.0)
(2.5,2.5) (3.0,3.0)

Правила для делегирования инициализатора

Типы значений Типы классов
Наследование не поддерживается для типов значений, таких как структуры и перечисления. Ссылка на другие инициализаторы осуществляется через self.init Наследование поддерживается. Проверяет, что все сохраненные значения свойств инициализированы

Наследование и инициализация класса

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

Назначенные инициализаторы и удобные инициализаторы

Назначенный инициализатор Удобный инициализатор
Считается первичной инициализацией для класса Рассматривается как поддерживающая инициализация для класса
Все свойства класса инициализируются, и для дальнейшей инициализации вызывается соответствующий инициализатор суперкласса. Назначенный инициализатор вызывается с удобным инициализатором для создания экземпляра класса для конкретного варианта использования или типа входного значения
По крайней мере один назначенный инициализатор определен для каждого класса Нет необходимости в обязательном определении удобных инициализаторов, когда класс не требует инициализаторов.
Init (параметры) {заявления} удобство init (параметры) {заявления}

Программа для назначенных инициализаторов

class mainClass {
   var no1 : Int // local storage
   init(no1 : Int) {
      self.no1 = no1 // initialization
   }
}

class subClass : mainClass {
   var no2 : Int // new subclass storage
   init(no1 : Int, no2 : Int) {
      self.no2 = no2 // initialization
      super.init(no1:no1) // redirect to superclass
   }
}

let res = mainClass(no1: 10)
let print = subClass(no1: 10, no2: 20)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("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)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

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

res is: 20
res is: 30
res is: 50

Инициализация наследования и переопределение

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

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

Live Demo

class sides {
   var corners = 4
   var description: String {
      return "\(corners) sides"
   }
}

let rectangle = sides()
print("Rectangle: \(rectangle.description)")

class pentagon: sides {
   override init() {
      super.init()
      corners = 5
   }
}

let bicycle = pentagon()
print("Pentagon: \(bicycle.description)")

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

Rectangle: 4 sides
Pentagon: 5 sides

Назначенные и удобные инициализаторы в действии

Live Demo

class Planet {
   var name: String
   init(name: String) {
      self.name = name
   }
   convenience init() {
      self.init(name: "[No Planets]")
   }
}

let plName = Planet(name: "Mercury")
print("Planet name is: \(plName.name)")

let noplName = Planet()
print("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]

Сбойный инициализатор

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

  • Неверные значения параметров.
  • Отсутствие необходимого внешнего источника.
  • Условие, предотвращающее успешную инициализацию.

Для отлова исключений, генерируемых методом инициализации, Swift 4 производит гибкую инициализацию, называемую «сбойный инициализатор», чтобы уведомить пользователя о том, что что-то осталось незамеченным при инициализации структуры, класса или членов перечисления. Ключевое слово, чтобы поймать сбой инициализатора — «init?». Кроме того, инициализируемые и неисправные инициализаторы не могут быть определены с одинаковыми типами параметров и именами.

Live Demo

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 {
   print("Student name is specified")
}
let blankname = studrecord(stname: "")

if blankname == nil {
   print("Student name is left blank")
}

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

Student name is specified
Student name is left blank

Сбойные инициализаторы для перечислений

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

Live Demo

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 {
   print("With In Block Two")
}
let badresult = functions(funct: "five")

if badresult == nil {
   print("Block Does Not Exist")
}

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

With In Block Two
Block Does Not Exist

Сбойные инициализаторы для классов

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

Live Demo

class studrecord {
   let studname: String!
   init?(studname: String) {
      self.studname = studname
      if studname.isEmpty { return nil }
   }
}

if let stname = studrecord(studname: "Failable Initializers") {
   print("Module is \(stname.studname)")
}

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

Module is Optional("Failable Initializers")

Переопределение сбойного инициализатора

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

Инициализатор подкласса не может делегировать вплоть до инициализатора суперкласса при переопределении сбойной инициализатора суперкласса с необратимой инициализацией подкласса.

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

Приведенная ниже программа описывает сбойные и не сбойные инициализаторы.

Live Demo

class Planet {
   var name: String
   
   init(name: String) {
      self.name = name
   }
   convenience init() {
      self.init(name: "[No Planets]")
   }
}
let plName = Planet(name: "Mercury")
print("Planet name is: \(plName.name)")

let noplName = Planet()
print("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]

Посвящение! Сбойный инициализатор

Swift 4 предоставляет ‘init?’ определить необязательный экземпляр неисправного инициализатора. Чтобы определить неявно развернутый необязательный экземпляр определенного типа ‘init!’ указан.

Live Demo

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 {
   print("Student name is specified")
}

let blankname = studrecord(stname: "")

if blankname == nil {
   print("Student name is left blank")
}

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

Student name is specified
Student name is left blank

Требуемые инициализаторы

Чтобы объявить каждый подкласс инициализируемого ключевого слова ‘required’, необходимо определить его перед функцией init ().

Live Demo

class classA {
   required init() {
      var a = 10
      print(a)
   }
}

class classB: classA {
   required init() {
      var b = 30
      print(b)
   }
}

let res = classA()
let print = classB()

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

10
30
10

Свифт — Деинициализация

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

Деинициализация для освобождения пространства памяти

Swift 4 автоматически освобождает ваши экземпляры, когда они больше не нужны, чтобы освободить ресурсы. Swift 4 выполняет управление памятью экземпляров с помощью автоматического подсчета ссылок (ARC), как описано в разделе «Автоматический подсчет ссылок». Как правило, вам не нужно выполнять ручную очистку, когда ваши экземпляры освобождаются. Однако, когда вы работаете с собственными ресурсами, вам может потребоваться выполнить дополнительную очистку самостоятельно. Например, если вы создаете пользовательский класс, чтобы открыть файл и записать в него некоторые данные, вам может потребоваться закрыть файл до освобождения экземпляра класса.

var counter = 0; // for reference counting
class baseclass {
   init() {
      counter++;
   }
   deinit {
      counter--;
   }
}
var print: baseclass? = baseclass()

print(counter)
print = nil
print(counter)

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

1
0

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

var counter = 0; // for reference counting

class baseclass {
   init() {
      counter++;
   }
   deinit {
      counter--;
   }
}
var print: baseclass? = baseclass()
print(counter)
print(counter)

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

1
1

Свифт — Обзор ARC

Функции управления памятью и ее использование обрабатываются на языке Swift 4 с помощью автоматического подсчета ссылок (ARC). ARC используется для инициализации и деинициализации системных ресурсов, освобождая тем самым пространство памяти, используемое экземплярами класса, когда экземпляры больше не нужны. ARC отслеживает информацию об отношениях между нашими экземплярами кода для эффективного управления ресурсами памяти.

Функции АРК

  • ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.

  • Информация о типе экземпляра и его значениях хранятся в памяти.

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

  • ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.

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

ARC выделяет кусок памяти для хранения информации каждый раз, когда init () создает новый экземпляр класса.

Информация о типе экземпляра и его значениях хранятся в памяти.

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

ARC отслеживает в настоящее время ссылающиеся на свойства экземпляров класса, константы и переменные, так что deinit () применяется только к этим неиспользуемым экземплярам.

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

Программа ARC

Live Demo

class StudDetails {
   var stname: String!
   var mark: Int!
   
   init(stname: String, mark: Int) {
      self.stname = stname
      self.mark = mark
   }
   deinit {
      print("Deinitialized \(self.stname)")
      print("Deinitialized \(self.mark)")
   }
}

let stname = "Swift 4"
let mark = 98

print(stname)
print(mark)

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

Swift 4
98

Экземпляры класса ARC Strong Reference Cycles

Live Demo

class studmarks {
   let name: String
   var stud: student?
   
   init (name: String) {
      print("Initializing: \(name)")
      self.name = name
   }
   deinit {
      print("Deallocating: \(self.name)")
   }
}

class student {
   let name: String
   var strname: studmarks?
   
   init (name: String) {
      print("Initializing: \(name)")
      self.name = name
   }
   deinit {
      print("Deallocating: \(self.name)")
   }
}

var shiba: studmarks?
var mari: student?

shiba = studmarks(name: "Swift 4")
mari = student(name: "ARC")

shiba!.stud = mari
mari!.strname = shiba

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

Initializing: Swift 4
Initializing: ARC

ARC Слабые и неизвестные ссылки

У свойств типа класса есть два способа разрешения сильных ссылочных циклов —

  • Слабые ссылки
  • Неизвестные ссылки

Эти ссылки используются, чтобы позволить одному экземпляру ссылаться на другие экземпляры в ссылочном цикле. Тогда экземпляры могут ссылаться на каждый экземпляр вместо того, чтобы заботиться о сильном ссылочном цикле. Когда пользователь знает, что какой-то экземпляр может возвращать значения ‘nil’, мы можем указать это, используя слабую ссылку. Когда экземпляр будет возвращать что-то, а не ноль, объявите это с неизвестной ссылкой.

Слабая справочная программа

Live Demo

class module {
   let name: String
   init(name: String) { self.name = name }
   var sub: submodule?
   deinit { print("\(name) Is The Main Module") }
}

class submodule {
   let number: Int
   init(number: Int) { self.number = number }
   weak var topic: module?

   deinit { print("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

Неизвестная справочная программа

Live Demo

class student {
   let name: String
   var section: marks?
   init(name: String) {
      self.name = name
   }
   deinit { print("\(name)") }
}

class marks {
   let marks: Int
   unowned let stname: student
   
   init(marks: Int, stname: student) {
      self.marks = marks
      self.stname = stname
   }
   deinit { print("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 ()». Сильные опорные циклы используются в качестве опорных типов для замыканий.

Live Demo

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 {
      print("\(samplename) is being deinitialized")
   }
}

var paragraph: HTMLElement? = HTMLElement(samplename: "p", text: "Welcome to Closure SRC")
print(paragraph!.asHTML())

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

<p>Welcome to Closure SRC</p>

Слабые и неизвестные ссылки

Когда замыкание и экземпляр ссылаются друг на друга, пользователь может определить захват в замыкании как неподтвержденную ссылку. Тогда он не позволит пользователю одновременно освободить экземпляр. Когда экземпляр когда-нибудь вернет значение ‘nil’, определите замыкание со слабым экземпляром.

Live Demo

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 {
      print("\(module) the deinit()")
   }
}

var paragraph: HTMLElement? = HTMLElement(module: "Inside", text: "ARC Weak References")
print(paragraph!.asHTML())
paragraph = nil

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

<Inside>ARC Weak References</Inside>
Inside the deinit()

Swift — опциональная цепочка

Процесс запроса, вызова свойств, подписок и методов для необязательного параметра, который может иметь значение «ноль», определяется как необязательное сцепление. Необязательная цепочка возвращает два значения —

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

  • если необязательный параметр содержит значение ‘nil’, все связанные с ним свойства, методы и индексы возвращают nil

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

если необязательный параметр содержит значение ‘nil’, все связанные с ним свойства, методы и индексы возвращают nil

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

Необязательное создание цепочки как альтернатива принудительной распаковке

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

Необязательная цепочка ‘?’ Доступ к методам, свойствам и подпискам. Опциональная цепочка ‘!’ заставить развернуть
? помещается после необязательного значения для вызова свойства, метода или индекса ! помещается после необязательного значения для вызова свойства, метода или индекса, чтобы принудительно развернуть значение
Сбои изящно, когда необязательный ‘ноль’ Принудительная распаковка вызывает ошибку во время выполнения, когда необязательный параметр ‘nil’

Программа для опциональной цепочки с ‘!’

class ElectionPoll {
   var candidate: Pollbooth?
}

lass Pollbooth {
   var name = "MP"
}

let cand = ElectionPoll()
let candname = cand.candidate!.name

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

fatal error: unexpectedly found nil while unwrapping an Optional value
0 Swift 4 0x0000000103410b68
llvm::sys::PrintStackTrace(__sFILE*) + 40
1 Swift 4 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 4 0x0000000102a85c39
llvm::JIT::runFunction(llvm::Function*, std::__1::vector > const&) + 329
6 Swift 4 0x0000000102d320b3
llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*,
std::__1::vector<std::__1::basic_string, std::__1::allocator >,
std::__1::allocator<std::__1::basic_string, std::__1::allocator > > > const&,
char const* const*) + 1523
7 Swift 4 0x000000010296e6ba Swift 4::RunImmediately(Swift
4::CompilerInstance&, std::__1::vector<std::__1::basic_string,
std::__1::allocator >, std::__1::allocator<std::__1::basic_string,
std::__1::allocator > > > const&, Swift 4::IRGenOptions&, Swift 4::SILOptions
const&) + 1066
8 Swift 4 0x000000010275764b frontend_main(llvm::ArrayRef,
char const*, void*) + 5275
9 Swift 4 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 4 -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 4'
import Foundation
</std::__1::basic_string</std::__1::basic_string</std::__1::basic_string</std::
__1::basic_string

Вышеуказанная программа объявляет «опрос выборов» в качестве имени класса и содержит «кандидат» в качестве функции членства. Подкласс объявляется как «опросная кабина», а «имя» — как функция членства, которая инициализируется как «MP». Вызов суперкласса инициализируется созданием экземпляра ‘Cand’ с необязательным ‘!’. Поскольку значения не объявлены в его базовом классе, значение ‘nil’ сохраняется, возвращая фатальную ошибку в процедуре принудительного развертывания.

Программа для необязательного связывания с ‘?’

Live Demo

class ElectionPoll {
   var candidate: Pollbooth?
}

class Pollbooth {
   var name = "MP"
}
let cand = ElectionPoll()

if let candname = cand.candidate?.name {
   print("Candidate name is \(candname)")
} else {
   print("Candidate name cannot be retreived")
}

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

Candidate name cannot be retreived

Программа выше объявляет «опрос выборов» в качестве имени класса и содержит «кандидат» в качестве функции членства. Подкласс объявляется как «опросная кабина», а «имя» — как функция членства, которая инициализируется как «MP». Вызов суперкласса инициализируется созданием экземпляра ‘Cand’ с необязательным ‘?’. Поскольку значения не объявлены в его базовом классе, значение ‘nil’ сохраняется и печатается в консоли блоком обработки else.

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

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

Live Demo

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() {
      print("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 {
   print("Area of rectangle is \(rectarea)")
} else {
   print("Rectangle Area is not specified")
}

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

Rectangle Area is not specified

Вызов методов через необязательную цепочку

Live Demo

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() {
      print("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 {
   print("Area of circle is specified)")
} else {
   print("Area of circle is not specified")
}

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

Area of circle is not specified

Функция circleprint (), объявленная внутри подкласса circle (), вызывается путем создания экземпляра с именем ‘circname’. Функция вернет значение, если оно содержит какое-либо значение, в противном случае она вернет определенное пользователем сообщение для печати, проверив оператор «if circname.print? .Circleprint ()! = Nil».

Доступ к подпискам через необязательную цепочку

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

Программа 1

Live Demo

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() {
      print("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 {
   print("The first room name is \(radiusName).")
} else {
   print("Radius is not specified.")
}

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

Radius is not specified.

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

Программа 2

Live Demo

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() {
      print("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 {
   print("Radius is measured in \(radiusName).")
} else {
   print("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() {
      print("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]--

print(area["Radius"]?[0])
print(area["Radius"]?[1])
print(area["Radius"]?[2])
print(area["Radius"]?[3])

print(area["Circle"]?[0])
print(area["Circle"]?[1])
print(area["Circle"]?[2])

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

Optional(35)
Optional(78)
Optional(78)
Optional(101)
Optional(90)
Optional(44)
Optional(56)

Доступ к дополнительным значениям для подписок можно получить, сославшись на их значения. Доступ к нему можно получить как индекс [0], индекс [1] и т. Д. Значения индекса по умолчанию для «радиуса» сначала назначаются как [35, 45, 78, 101] и для «круга» [90, 45, 56]] , Затем значения нижнего индекса изменяются как Радиус [0] на 78 и Круг [1] на 45.

Связывание нескольких уровней цепочки

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

Несколько цепочек необязательных могут быть связаны —

Если тип извлечения не является необязательным, необязательное сцепление вернет необязательное значение. Например, если String через необязательную цепочку вернет String? Значение

Live Demo

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() {
      print("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 {
   print("The first room name is \(radiusName).")
} else {
   print("Radius is not specified.")
}

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

Radius is not specified.

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

Если тип получения уже является необязательным, то необязательное сцепление также возвратит необязательное значение. Например, если строка? Доступ через необязательную цепочку вернет String? Значение..

Live Demo

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() {
      print("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 {
   print("Radius is measured in \(radiusName).")
} else {
   print("Radius is not specified.")
}

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

Radius is measured in Units.

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

Цепочка для методов с необязательными возвращаемыми значениями

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

Live Demo

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() {
      print("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 {
   print("Area of circle is specified)")
} else {
   print("Area of circle is not specified")
}

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

Area of circle is not specified

Swift — Type Casting

Для проверки типа экземпляра «Приведение типов» вступает в игру на языке Swift 4. Он используется для проверки того, принадлежит ли тип экземпляра определенному суперклассу или подклассу или определен в его собственной иерархии.

Приведение типов Swift 4 предоставляет два оператора «is» для проверки типа значения и «as» и для приведения значения типа к другому типу. Приведение типов также проверяет, соответствует ли тип экземпляра определенному стандарту соответствия протокола.

Определение иерархии классов

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

Live Demo

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")
print("Instance physics is: \(samplechem.physics)")
print("Instance equation is: \(samplechem.equations)")

let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
print("Instance physics is: \(samplemaths.physics)")
print("Instance formulae is: \(samplemaths.formulae)")

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

Instance physics is: solid physics
Instance equation is: Hertz
Instance physics is: Fluid Dynamics
Instance formulae is: Giga Hertz

Проверка типа

Проверка типа выполняется оператором is. Оператор проверки типа is проверяет, принадлежит ли экземпляр определенному типу подкласса, и возвращает true, если он принадлежит этому экземпляру, иначе он вернет false.

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")
print("Instance physics is: \(samplechem.physics)")
print("Instance equation is: \(samplechem.equations)")

let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
print("Instance physics is: \(samplemaths.physics)")
print("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
   }
}

print("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

понижающее приведение

Понижение типа подкласса может быть выполнено с двумя операторами (как? И как!). ‘Как?’ возвращает необязательное значение, когда значение возвращает ноль. Используется для проверки успешного даункаута.

‘как!’ возвращает принудительное развертывание, как описано в необязательной цепочке, когда downcasting возвращает значение nil. Он используется для запуска ошибки во время выполнения в случае сбоя downcast

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")
print("Instance physics is: \(samplechem.physics)")
print("Instance equation is: \(samplechem.equations)")

let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
print("Instance physics is: \(samplemaths.physics)")
print("Instance formulae is: \(samplemaths.formulae)")

var chemCount = 0
var mathsCount = 0

for item in sa {
   if let print = item as? Chemistry {
      print("Chemistry topics are: '\(print.physics)', \(print.equations)")
   } else if let example = item as? Maths {
      print("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

Typecasting: Любой и Любой Объект

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

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")
print("Instance physics is: \(samplechem.physics)")
print("Instance equation is: \(samplechem.equations)")

let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
print("Instance physics is: \(samplemaths.physics)")
print("Instance formulae is: \(samplemaths.formulae)")

var chemCount = 0
var mathsCount = 0

for item in sa {
   if let print = item as? Chemistry {
      print("Chemistry topics are: '\(print.physics)', \(print.equations)")
   } else if let example = item as? Maths {
      print("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:
         print("Integer value is \(someInt)")
      case let someDouble as Double where someDouble > 0:
         print("Pi value is \(someDouble)")
      case let someString as String:
         print("\(someString)")
      case let phy as Chemistry:   
         print("Topics '\(phy.physics)', \(phy.equations)")
      default:
         print("None")
   }
}

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

Instance physics is: solid physics
Instance equation is: Hertz
Instance physics is: Fluid Dynamics
Instance formulae is: Giga Hertz
Chemistry topics are: 'solid physics', Hertz
Maths topics are: 'Fluid Dynamics', Giga Hertz
Chemistry topics are: 'Thermo physics', Decibels
Maths topics are: 'Astro Physics', MegaHertz
Maths topics are: 'Differential Equations', Cosine Series
Integer value is 12
Pi value is 3.14159
Example for Any
Topics 'solid physics', Hertz

AnyObject

Для представления экземпляра любого типа класса используется ключевое слово «AnyObject».

class Subjects {
   var physics: String
   init(physics: String) {
      self.physics = physics
   }
}

class Chemistry: Subjects {
   var equations: String
   init(physics: String, equations: String) {
      self.equations = equations
      super.init(physics: physics)
   }
}

class Maths: Subjects {
   var formulae: String
   init(physics: String, formulae: String) {
      self.formulae = formulae
      super.init(physics: physics)
   }
}

let saprint: [AnyObject] = [Chemistry(physics: "solid physics", equations: "Hertz"),
   Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
   Chemistry(physics: "Thermo physics", equations: "Decibels"),
   Maths(physics: "Astro Physics", formulae: "MegaHertz"),
   Maths(physics: "Differential Equations", formulae: "Cosine Series")]

let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
print("Instance physics is: \(samplechem.physics)")
print("Instance equation is: \(samplechem.equations)")

let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
print("Instance physics is: \(samplemaths.physics)")
print("Instance formulae is: \(samplemaths.formulae)")

var chemCount = 0
var mathsCount = 0

for item in saprint {
   if let print = item as? Chemistry {
      print("Chemistry topics are: '\(print.physics)', \(print.equations)")
   } else if let example = item as? Maths {
      print("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:
         print("Integer value is \(someInt)")
      case let someDouble as Double where someDouble > 0:
         print("Pi value is \(someDouble)")
      case let someString as String:
         print("\(someString)")
      case let phy as Chemistry:
         print("Topics '\(phy.physics)', \(phy.equations)")
      default:
         print("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
}

Вычисленные свойства

Вычисленные свойства «instance» и «type» также могут быть расширены с помощью расширений.

Live Demo

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
print("Addition is \(addition)")

let subtraction = 120.sub
print("Subtraction is \(subtraction)")

let multiplication = 39.mul
print("Multiplication is \(multiplication)")

let division = 55.div
print("Division is \(division)")

let mix = 30.add + 34.sub
print("Mixed Type is \(mix)")

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

Addition is 103
Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

Инициализаторы

Swift 4 обеспечивает гибкость добавления новых инициализаторов к существующему типу с помощью расширений. Пользователь может добавить свои собственные пользовательские типы для расширения уже определенных типов, также возможны дополнительные параметры инициализации. Расширения поддерживают только init (). deinit () не поддерживается расширениями.

Live Demo

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()
print ("Inside mult block \(calc.a.num1, calc.a.num2)")
print("Inside mult block \(calc.b.no1, calc.b.no2)")

let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))
print("Inside mult block \(memcalc.a.num1, memcalc.a.num2)")
print("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)
print("Inside Sum Block:\( a.num1, a.num2)")

let b = diff(no1: 200, no2: 100)
print("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)

методы

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

Live Demo

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation()
      }
   }
}

4.topics(summation: {
   print("Inside Extensions Block")
})

3.topics(summation: {
   print("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

Функция themes () принимает аргумент типа ‘(summation: () → ())’, чтобы указать, что функция не принимает аргументов и не возвращает никаких значений. Чтобы вызвать эту функцию несколько раз, инициализируется блок, и инициализируется вызов метода с topic ().

Методы мутации экземпляров

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

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

Live Demo

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
print("Area of circle is: \(Trial1)")

var Trial2 = 5.8
Trial2.square()
print("Area of circle is: \(Trial2)")

var Trial3 = 120.3
Trial3.square()
print("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
   }
}

print(12[0])
print(7869[1])
print(786543[2])

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

2
6
5

Вложенные типы

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

Live Demo

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:
            print(" 10 ")
         case .sub:
            print(" 20 ")
         case .mult:
            print(" 30 ")
         case .div:
            print(" 40 ")
         default:
            print(" 50 ")
      }
   }
}
result(numb: [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 
}

Требования к свойствам и методам

Протокол используется для указания конкретного свойства типа класса или свойства экземпляра. Он просто указывает только свойство типа или экземпляра, а не указывает, является ли оно хранимым или вычисляемым свойством. Кроме того, он используется для указания, является ли свойство «доступным для установки» или «устанавливаемым».

Требования к свойствам объявляются ключевым словом var в качестве переменных свойств. {get set} используется для объявления свойств gettable и settable после объявления их типа. Gettable упоминается свойством {get} после объявления их типа.

Live Demo

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 4 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 4"
studdet.marks = 98
studdet.markssecured()

print(studdet.marks)
print(studdet.result)
print(studdet.present)
print(studdet.subject)
print(studdet.stname)

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

98
true
false
Swift 4 Protocols
Swift 4

Требования метода мутации

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
            print("Sunday")
         case mon:
            self = mon
            print("Monday")
         case tue:
            self = tue
            print("Tuesday")
         case wed:
            self = wed
            print("Wednesday")
         case mon:
            self = thurs
            print("Thursday")
         case tue:
            self = fri
            print("Friday")
         case sat:
            self = sat
            print("Saturday")
         default:
            print("NO Such Day")
      }
   }
}

var res = days.wed
res.print()

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

Wednesday

Требования к инициализатору

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

Синтаксис

protocol SomeProtocol {
   init(someParameter: Int)
}

Например

protocol tcpprotocol {
   init(aprot: Int)
}

Реализации класса требований инициализатора протокола

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

class SomeClass: SomeProtocol {
   required init(someParameter: Int) {
      // initializer implementation statements
   }
}

protocol tcpprotocol {
   init(aprot: Int)
}

class tcpClass: tcpprotocol {
   required init(aprot: Int) {
   }
}

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

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

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)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

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

res is: 20
res is: 30
res is: 50

Протоколы как типы

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

Протоколы могут быть доступны как типы в —

  • Функция, метод или инициализация в качестве параметра или возвращаемого типа

  • Константа, переменная или свойство

  • Массивы, словари или другие контейнеры как элементы

Функция, метод или инициализация в качестве параметра или возвращаемого типа

Константа, переменная или свойство

Массивы, словари или другие контейнеры как элементы

protocol Generator {
   typealias members
   func next() -> members?
}

var items = [10,20,30].generate()
while let x = items.next() {
   print(x)
}

for lists in map([1,2,3], {i in i*5}) {
   print(lists)
}

print([100,200,300])
print(map([1,2,3], {i in i*10}))

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

10
20
30
5
10
15
[100, 200, 300]
[10, 20, 30]

Добавление протокола соответствия с расширением

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

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 4 позволяет протоколам наследовать свойства от определенных им свойств. Это похоже на наследование классов, но с возможностью перечисления нескольких унаследованных протоколов, разделенных запятыми.

Live Demo

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(sum: 1)
   }
}
class classb: result {
   func print(target: classa) {
      target.calc(sum: 5)
   }
}

class student: classa {
   var no1: Int = 10
   
   func calc(sum: Int) {
      no1 -= sum
      print("Student attempted \(sum) times to pass")
         
      if no1 <= 0 {
         print("Student is absent for exam")
      }
   }
}

class Player {
   var stmark: result!

   init(stmark: result) {
      self.stmark = stmark
   }
   func print(target: classa) {
      stmark.print(target: target)
   }
}

var marks = Player(stmark: student2())
var marksec = student()

marks.print(target: marksec)
marks.print(target: marksec)
marks.print(target: marksec)
marks.stmark = classb()
marks.print(target: marksec)
marks.print(target: marksec)
marks.print(target: 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)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

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

res is: 20
res is: 30
res is: 50

Состав протокола

Swift 4 позволяет вызывать несколько протоколов одновременно с помощью составления протокола.

Синтаксис

protocol<SomeProtocol, AnotherProtocol>

пример

Live Demo

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: stname & stage) {
   print("\(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)

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

Person(name: "Priya", age: 21)
Person(name: "Rehan", age: 29)
Person(name: "Roshan", age: 19)

Проверка соответствия протокола

Соответствие протокола проверяется операторами «is» и «as», аналогичными операторам приведения типов.

  • Оператор is возвращает true, если экземпляр соответствует стандарту протокола, и возвращает false, если произошел сбой.

  • То как? версия оператора downcast возвращает необязательное значение типа протокола, и это значение равно nil, если экземпляр не соответствует этому протоколу.

  • Версия as оператора downcast принудительно понижает тип протокола и вызывает ошибку времени выполнения, если downcast не удается.

Оператор is возвращает true, если экземпляр соответствует стандарту протокола, и возвращает false, если произошел сбой.

То как? версия оператора downcast возвращает необязательное значение типа протокола, и это значение равно nil, если экземпляр не соответствует этому протоколу.

Версия as оператора downcast принудительно понижает тип протокола и вызывает ошибку времени выполнения, если downcast не удается.

import Foundation

@objc protocol rectangle {
   var area: Double { get }
}
@objc class Circle: rectangle {
   let pi = 3.1415927
   var radius: Double
   var area: Double { return pi * radius * radius }
   init(radius: Double) { self.radius = radius }
}
@objc class result: rectangle {
   var area: Double
   init(area: Double) { self.area = area }
}
class sides {
   var rectsides: Int
   init(rectsides: Int) { self.rectsides = rectsides }
}
let objects: [AnyObject] = [Circle(radius: 2.0),result(area:198),sides(rectsides: 4)]

for object in objects {
   if let objectWithArea = object as? rectangle {
      print("Area is \(objectWithArea.area)")
   } else {
      print("Rectangle area is not defined")
   }
}

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

Area is 12.5663708
Area is 198.0
Rectangle area is not defined

Свифт — Дженерики

Язык Swift 4 предоставляет «универсальные» функции для написания гибких и многократно используемых функций и типов. Обобщения используются, чтобы избежать дублирования и обеспечить абстракцию. Стандартные библиотеки Swift 4 построены с использованием универсального кода. Типы Swift 4s ‘Arrays’ и ‘Dictionary’ относятся к общим коллекциям. С помощью массивов и словарей массивы определяются для хранения значений «Int» и «String» или любых других типов.

Live Demo

func exchange(a: inout Int, b: inout Int) {
   let temp = a
   a = b
   b = temp
}

var numb1 = 100
var numb2 = 200

print("Before Swapping values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping values are: \(numb1) and \(numb2)")

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

Before Swapping values are: 100 and 200
After Swapping values are: 200 and 100

Общие функции: параметры типа

Общие функции могут использоваться для доступа к любому типу данных, например, «Int» или «String».

Live Demo

func exchange<T>(a: inout T, b: inout T) {
   let temp = a
   a = b
   b = temp
}
var numb1 = 100
var numb2 = 200

print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")

var str1 = "Generics"
var str2 = "Functions"

print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("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

Функция exchange () используется для обмена значениями, которые описаны в приведенной выше программе, а <T> используется в качестве параметра типа. В первый раз вызывается функция exchange (), которая возвращает значения «Int», а второй вызов функции exchange () возвращает значения «String». Несколько угловых параметров могут быть включены в угловые скобки, разделенные запятыми.

Параметры типа именуются как пользовательские, чтобы знать назначение параметра типа, который он содержит. Swift 4 предоставляет <T> в качестве имени параметра универсального типа. Однако параметры типа, такие как массивы и словари, также могут быть названы в качестве ключа, значения, чтобы определить, что они принадлежат к типу «Словарь».

Live Demo

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(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

let deletetos = tos.pop()

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

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

Расширение универсального типа

Расширение свойства стека для определения вершины элемента включено с ключевым словом extension.

Live Demo

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(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

extension TOS {
   var first: T? {
      return items.isEmpty ? nil : items[items.count - 1]
   }
}
if let first = tos.first {
   print("The top item on the stack is \(first).")
}

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

["Swift 4"]
["Swift 4", "Generics"]
["Swift 4", "Generics", "Type Parameters"]
["Swift 4", "Generics", "Type Parameters", "Naming Type Parameters"]
The top item on the stack is Naming Type Parameters.

Тип Ограничения

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

Live Demo

func exchange<T>(a: inout T, b: inout T) {
   let temp = a
   a = b
   b = temp
}
var numb1 = 100
var numb2 = 200

print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")

var str1 = "Generics"
var str2 = "Functions"

print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("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 4 позволяет объявлять связанные типы в определении протокола по ключевому слову «relatedtype».

Live Demo

protocol Container {
   associatedtype 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: item)
   }
   var count: Int {
      return items.count
   }
   subscript(i: Int) -> T {
      return items[i]
   }
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)

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

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

Где пункты

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

protocol Container {
   associatedtype 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: 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(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Where Clause")
print(tos.items)

var eos = ["Swift 4", "Generics", "Where Clause"]
print(eos)

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

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]

Swift — Контроль доступа

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

Модель контроля доступа основана на модулях и исходных файлах.

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

Язык Swift 4 предоставляет три различных уровня доступа. Это публичный, внутренний и частный доступ.

S.No Уровни доступа и определение
1

общественного

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

2

внутренний

Позволяет использовать сущности в любом исходном файле из их определяющего модуля, но не в любом исходном файле за пределами этого модуля.

3

Частный

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

общественного

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

внутренний

Позволяет использовать сущности в любом исходном файле из их определяющего модуля, но не в любом исходном файле за пределами этого модуля.

Частный

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

Синтаксис

public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

Контроль доступа для типов функций

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

Live Demo

private func sum(a: Int, b: Int) {
   let a = a + b
   let b = a - b
   print(a, b)
}

sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)

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

30 20
50 40
30 24

Контроль доступа для типов перечисления

Live Demo

public enum Student {
   case Name(String)
   case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Swift 4")
var studMarks = Student.Mark(98,97,95)

switch studMarks {
   case .Name(let studName):
      print("Student name is: \(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      print("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
   
}

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

Student Marks are: 98,97,95

Перечисление на языке Swift 4 автоматически получает один и тот же уровень доступа для отдельных случаев перечисления. Рассмотрим, например, для доступа к имени ученика и отметкам, закрепленным в трех предметах. Имя перечисления объявляется как ученик, и члены, присутствующие в классе перечисления, являются именами, принадлежащими строковому типу данных, метки представляются как mark1, mark2 и mark3 типа данных Integer. Чтобы получить доступ либо к имени студента, либо к оценкам, которые он набрал. Теперь регистр коммутатора будет печатать имя студента, если этот блок регистра будет выполнен, иначе он будет печатать метки, закрепленные за студентом. Если оба условия не выполняются, будет выполнен блок по умолчанию.

Контроль доступа для подклассов

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

public class cricket {
   internal func printIt() {
      print("Welcome to Swift 4 Super Class")
   }
}

internal class tennis: cricket {
   override internal func printIt() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.printIt()

let tennisinstance = tennis()
tennisinstance.printIt()

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

Welcome to Swift Super Class
Welcome to Swift Sub Class

Контроль доступа для констант, переменных, свойств и подписок

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

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

private var privateInstance = SomePrivateClass()

Добытчики и сеттеры

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

Live Demo

class Samplepgm {
   var counter: Int = 0{
      willSet(newTotal) {
         print("Total Counter is: \(newTotal)")
      }
      didSet {
         if counter > oldValue {
            print("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

Контроль доступа для инициализаторов и инициализаторов по умолчанию

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

Чтобы объявить каждый подкласс инициализируемого ключевого слова ‘required’, необходимо определить его перед функцией init ().

Live Demo

class classA {
   required init() {
      let a = 10
      print(a)
   }
}
class classB: classA {
   required init() {
      let b = 30
      print(b)
   }
}
let res = classA()
let print = classB()

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

10
30
10

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

Контроль доступа к протоколам

Когда мы определяем новый протокол для наследования функциональных возможностей от существующего протокола, оба должны быть объявлены одинаковыми уровнями доступа для наследования свойств друг друга. Управление доступом Swift 4 не позволит пользователям определять «открытый» протокол, который наследуется от «внутреннего» протокола.

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)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

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

res is: 20
res is: 30
res is: 50

Контроль доступа для расширений

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

Контроль доступа для дженериков

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

Live Demo

public 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(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)
let deletetos = tos.pop()

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

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

Контроль доступа для псевдонимов типа

Пользователь может определить псевдонимы типов для обработки различных типов контроля доступа. Один и тот же уровень доступа или разные уровни доступа могут быть определены пользователем. Когда псевдоним типа ‘private’, его связанные члены могут быть объявлены как ‘private, internal of public type’. Когда псевдоним типа является общедоступным, члены не могут быть псевдонимами в качестве «внутреннего» или «частного» имени.

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

public protocol Container {
   associatedtype 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: 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(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Where Clause")
print(tos.items)

var eos = ["Swift 4", "Generics", "Where Clause"]
print(eos)

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

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]

Быстрое кодирование и декодирование

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

struct Language: Codable {
   var name: String
   var version: Int
}
let swift = Language(name: "Swift", version: 4)
let java = Language(name: "java", version: 8)
let R = Language(name: "R", version: 3

Обратите внимание, что Langauage соответствует Codable Protocol. Теперь мы преобразуем его в представление данных Json, используя одну простую строку.

let encoder = JSONEncoder()
if let encoded = try? encoder.encode(java) {
   //Perform some operations on this value.
}

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

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

let decoder = JSONDecoder()
if let decoded = try? decoder.decode(Language.self, from: encoded) {
   //Perform some operations on this value.
}

И JSONEncoder, и его аналог PropertyListEncoder со списком свойств имеют множество опций для настройки их работы.