1 of 66

Swift

к.т.н., доцент Каратанов Олександр Володимирович

2 of 66

Рейтинг мов програмування

За кількістю згадувань у результатах пошуку

3 of 66

Рейтинг мов програмування

За кількістю пошуку навчального матеріалу

4 of 66

Swift Playgrounds

Потрібен Mac

Ідеально для старту

Просто

Місцями надмірно

5 of 66

6 of 66

developer.apple.com

English

Ідеально

Багато графічних пояснень

Малувато посібників

7 of 66

Книга Swift Programming Language

  • Переклад офіційної книги "Swift Programming Language" від Apple: https://swiftbook.ru/contents/doc/

8 of 66

Усов В. А. �Swift. Основи розробки додатків під iOS

  • Практичний курс до книги:
  • https://swiftme.ru/oglavlenie-kursa-1175/

Відмінно розібрано Swift

Замало інфи про мобільну розробку

9 of 66

Swift для дітей. �Самовчитель зі створення додатків для iOS

Є практичні приклади мобільного розроблення

Стиль викладу місцями як для дебілів

і це добре

Багатослівно

10 of 66

Школа Брата Антонія

  • Курс Школи Swift Розробки Брата Антонія

Кумедний пузатик

11 of 66

Корисні посилання

  • Курс на Udemy зі Swift

12 of 66

Уроки від академії Яндекса �(не рекомендую)

Занудно

Затягнуто

Плутано

Складно

Корисно

13 of 66

Корисні посилання

  • Основи Swift. Повний курс в одному відео на 5 год. 31 хв.

14 of 66

15 of 66

16 of 66

17 of 66

Для чого потрібен Swift?

  • Варто вивчити Swift, якщо хочете створювати додатки для iPhone, Mac або watchOS.

Якщо хочете створювати веб-сторінки або працювати з базами даних, Swift - не найкращий вибір.

18 of 66

Що вам потрібно?

  • Щоб програмувати на Swift, вам спочатку знадобиться:
  • MacBook.
  • Xcode.

Можете вивчити мову Swift без нього

19 of 66

Історія

  • Порівняно з іншими мовами програмування Swift дуже молода, випущена тільки 2014 року.

  • Вона була створена Крісом Латтнером та іншими розробниками з Apple.
  • Вони зробили це в основному для того, щоб замінити стару мову Objective-C і представити більш просте і добре організоване рішення для екосистеми IOS.

Ще одна причина для вивчення Swift полягає в тому, що це все ще нова мова програмування, яка постійно розширюється.

20 of 66

Swift vs Objective-C

  • Довгий час Objective-C був основою, на якій Apple будувала своє програмне забезпечення.
  • Вони розробили Swift, бажаючи мати власну пропрієтарну платформу. Власний означає, що Swift належить і контролюється тільки Apple.
  • Оскільки він був розроблений спеціально для їхніх продуктів, він працює краще, ніж інші мови.
  • Деякі розробники почали розглядати Objective-C як повільний і старий.
  • Swift було розроблено з метою замінити Objective-C і розробити мову, яка краще підходить для їхніх продуктів.
  • Objective-C і Swift дуже схожі.
  • Swift сумісний з додатками, раніше створеними на Objective-C.

21 of 66

Особливості Swift

  1. Swift також є типобезпечною мовою.
  2. Swift також було спрощено, щоб зробити його більш читабельним. Це робить Swift простішою для вивчення мовою для новачків, ніж Objective-C.
  3. Swift все ще молодий порівняно з іншими мовами, він постійно вдосконалюється.

22 of 66

Вибір середовища для розробки мовою Swift

AppCode

Xcode

CodeRunner

23 of 66

Online Swift IDE

  1. http://online.swiftplayground.run/
  2. https://www.tutorialspoint.com/compile_swift_online.php
  3. https://www.codingrooms.com/compiler/swift

24 of 66

Hello, world в Swift

print("Hello, world!")

25 of 66

Коментарі у Swift

  • Однорядкові коментарі: //
  • Багаторядкові коментарі: /* */

  • На відміну від багаторядкових коментарів у C, багаторядкові коментарі в Swift можуть бути вкладені в інші багаторядкові коментарі.

// це коментар

/* це теж коментар,

але написаний на двох рядках */

/* це початок першого багаторядкового коментаря

/* це другий, вкладений багаторядковий коментар */

це кінець першого багаторядкового коментаря */

26 of 66

Змінні

  • Числова змінна:

  • Рядкова змінна:

  • Імена мають бути написані в стилі camelCase.
  • Не можна оголосити ім'я змінної, що починається з цифри.
  • Можна називати свої змінні за допомогою смайликів. 😂

var theAnswerToTheUltimateQuestionOfLife = 42

var bestBook = "The Hobbit, or There and Back Again"

var 😂 = "​😂​😹​"

27 of 66

Константи

  • Для констант використовується ключове слово let.

  • Якщо збережене значення у вашому коді не змінюватиметься, завжди оголошуйте його як константу, використовуючи ключове слово let.

let girlsAge = 20

28 of 66

Назва констант і змінних

  • Ви можете використовувати майже будь-які символи для назв констант і змінних, включно з Unicode-символами:

  • Імена констант і змінних не можуть містити пробілів, математичних символів, стрілок, приватних (або невалідних) кодових точок Unicode, а також символів відмальовування ліній або прямокутників.

let π = 3.14159

let 你好 = "你好世界"

let ?? = "dogcow"

29 of 66

Крапки з комою

  • Використання крапки з комою (;) після кожного оператора в Swift абсолютно необов'язкове, якщо тільки ви не хочете розмістити кілька незалежних операторів в одному рядку, і в цьому випадку крапка з комою обов'язкова.

  • Можна оголосити кілька констант або кілька змінних в одному рядку, розділяючи їх комами:

var x = 0.0, y = 0.0, z = 0.0

print("Усе в руках людини."); print("Тому їх треба частіше мити.")

30 of 66

Виведення на екран

  • Виведення тексту:

  • Виведення змінної:

  • Виведення змінної в тексті:

var myVariable = 42

print("The value is \(myVariable)")

var khai = "National Aerospace University \"Kharkiv Aviation Institute\""

print(khai)

print("Життя прекрасне, якщо навчишся жити")

31 of 66

Виведення на екран без перенесення курсору

  • За замовчуванням функція закінчує виведення символом переносу рядка.
  • Щоб вивести в консоль значення без перенесення на новий рядок, потрібно вказати в параметрі terminator щось інше, наприклад,

  • Результат - виведення в один рядок через пробіл:

print("У чому призначення людини?", terminator: " "); print("Бути людиною.")

У чому призначення людини? Бути людиною.

32 of 66

Анотація типів

  • Можете додати позначення типу, коли оголошуєте константу або змінну, щоб мати чітке уявлення про типи значень, які можуть зберігати константи або змінні.

  • Оголосити змінну з іменем welcomeMessage, тип якої буде String:

  • Можете створити кілька змінних одного типу в одному рядку, розділеному комами, з однією анотацією типу після останнього імені змінної:

var welcomeMessage: String

var red, green, blue: Double

33 of 66

Типи даних у Swift

Тип

Розмір у байтах

Діапазон прийнятих значень

bool

1

true   /   false

Int8

1

–128 / 127

UInt8

1

0 / 255

Int16

2

-32 768    /    32 767

UInt16

2

0  /  65 535

Int

Int32 або Int64

–9223372036854775808 (?) / 9223372036854775807 (?)

UInt

UInt32 або UInt64

0 / 18446744073709551615 (?)

Int32

4

-2 147 483 648    /    2 147 483 647

UInt32

4

0     /     4 294 967 295

Int64

8

–9223372036854775808 / 9223372036854775807

UInt64

8

0 / 18446744073709551615

float

4

до 6 знаков в дробной части

double

8

до 15 знаков в дробной части

34 of 66

Character

  • Для роботи з текстом застосовуються два типи даних: Character і String.
  • Character представляє окремий символ, а String - рядок із кількох символів.

  • Перетворення в рядок

var a: Character = "a"

var hello: String = "hello"

var number: Int = 22

var str: String = String(number)    // "22"

35 of 66

Межі цілих чисел

  • Отримаємо доступ до мінімального і максимального значення кожного типу цілого числа за допомогою його властивостей min і max:

  • Int має той самий розмір що й розрядність системи:
  • на 32-бітній платформі, Int того ж розміру що й Int32
  • на 64-бітній платформі, Int того ж розміру що й Int64

  • Беззнаковий тип цілого числа - UInt

let minValue = UInt8.min // minValue дорівнює 0, а його тип UInt8

let maxValue = UInt8.max // maxValue дорівнює 255, а його тип UInt8

36 of 66

Числові літерали

  1. Десяткове число, без префікса
  2. Двійкове число, із префіксом 0b
  3. Восьмеричне число, із префіксом 0o
  4. Шістнадцяткове число, із префіксом 0x
  5. Усі ці літерали цілого числа мають десяткове значення 17:

let decimalInteger = 17

let binaryInteger = 0b10001 // 17 у двійковій нотації

let octalInteger = 0o21 // 17 у вісімковій нотації

let hexadecimalInteger = 0x11 // 17 у шістнадцятковій нотації

37 of 66

Перетворення цілих чисел

  • Щоб перетворити один числовий тип в інший, необхідно створити нове число бажаного типу з наявного значення.
  • Нижче, у прикладі, константа twoThousand має тип UInt16, тоді як константа one - UInt8. Скласти їх безпосередньо не вийде, тому що вони різного типу. Натомість, у прикладі викликається функція UInt16(one) для створення нового числа UInt16 зі значення константи one:

let twoThousand: UInt16 = 2_000

let one: UInt8 = 1

let twoThousandAndOne = twoThousand + UInt16(one)

38 of 66

Тест

  • Що буде виведено на екран?

  1. 20
  2. Помилка компіляції, оскільки відсутнє приведення типів

var a: Int8 = 10

var b: Int32 = 10

var c = a + b

39 of 66

Логічні типи

  • У Swift є простий логічний тип Bool. Цей тип називають логічним, тому що він може бути тільки true або false.

let orangesAreOrange = true

let turnipsAreDelicious = false

40 of 66

Опціональні типи

  • Опціональні типи представляють об'єкти, які можуть мати, а можуть і не мати значення.
  • Опціональні типи виступають двійниками базових типів. Усі вони мають наприкінці знак питання: Int?, String? тощо.
  • Знак питання якраз вказує, що це опціональний тип.

  • Аналогічний запис:

var number: Int? = 12

number = nil   // тепер змінна number не має значення

print(number) // nil

var number: Optional<Int> = 12

41 of 66

Арифметичні операції у Swift

  • + — додавання;

  • - — віднімання;

  • * — множення;

  • / — ділення;

  • % — залишок від ділення.

Тільки для цілочисельних.

На нуль ділити не можна!

42 of 66

Операції присвоювання

Операція

Позначення

Приклад

Екв.приклад

Пояснення

операція присвоювання- додавання

+=

var += 16

var = var + 16

Додаємо до значення змінної var число 16, результат підсумовування зберігається у змінній var

операція присвоювання-віднімання

-=

var -= 16

var = var — 16

Віднімаємо зі змінної var число 16, результат віднімання зберігається у змінній var

операція присвоювання-множення

*=

var *= 16

var = var * 16

Множимо значення змінної var у 16 разів, результат множення присвоюється змінній var

операція присвоювання-ділення

/=

var /= 16

var = var / 16

Ділимо значення змінної var на 16, результат ділення присвоюється змінній var

операція присвоювання-залишку від ділення

%=

var %= 16

var = var % 16

Знаходимо залишок від ділення і зберігаємо його у змінній var

43 of 66

Інкремент і декремент

  • Відсутній, треба писати так:

var x = 0

x += 1

print(x)

44 of 66

Тест

  • Що буде виведено на екран?

var x = 0

x +=1

print(x)

Це важливо: пробіли навколо операцій - обов'язкові з двох боків!

Або їх може не бути з обох боків - тоді теж працюватиме коректно.

45 of 66

Оператори порівняння

Оператор порівняння

Swift

Рівність

==

Нерівність

<>

Більше

Більше або дорівнює

>

>=

Менше

Менше або дорівнює

<

<=

46 of 66

Логічні оператори

  • Операції порівняння та логічні операції в результаті дають значення типу bool, тобто true або false.

Логічні оператори

Swift

Логічне І

&&

Логічне АБО

||

Логічне НЕ

!

47 of 66

Таблиця істинності логічних операцій

a

b

a &&b

a||b

true

true

true

true

true

false

false

true

false

true

false

true

false

false

false

false

~a

false

false

true

true

48 of 66

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

  • Бітові операції повертають нам число.
  • Також є низка операцій, які поєднують порозрядні операції з присвоюванням: &=, |=, ^=, <<=, >>=

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

Swift

Побітове І

&

Побітове АБО

|

Побітове НЕ (інверсія)

~

Виключне АБО

^

Побітовий зсув уліво

<<

Побітовий зсув вправо

>>

49 of 66

Байт. Біти

7 6 5 4 3 2 1 0

7

6

5

4

3

2

1

0

27

26

25

24

23

22

21

20

128

64

32

16

8

4

2

1

50 of 66

Побітові операції

a

(біт 1)

b

(біт 2)

a & b

(a і b)

a | b

(a або b)

a ^ b

(a викл. ибо b)

~a

(не а)

 0

 0

 0

0

0

1

 0

 1

 0

1

1

1

1

 0

 0

1

1

0

1

1

 1

1

0

0

Операція "І" аналогічна множенню біт.

"АБО" - додаванню.

"НЕ" - інверсії.

51 of 66

Кортежі

  • Кортежі або Tuples представляють набір значень, які розглядаються як один об'єкт.
  • Для створення кортежу використовуються дужки, усередині яких записуються всі елементи кортежу:

  • Доступ до елементів кортежу:

let props = (22, "age")

var userInfo = (true, 34, "Tom")

var userInfo: (Bool, Int, String) = (true, 34, "Tom")

let age = userInfo.1

let isMarried = userInfo.0

var name = userInfo.2

Можемо змінювати елементи кортежу, якщо кортеж визначений як змінна

52 of 66

Умовна конструкція

  • Конструкція if перевіряє істинність деякої умови і залежно від результатів перевірки виконує певний код:

let num1 = 22

let num2 = 15

if num1 > num2{

     

    print("num1 більше ніж num2")

}

53 of 66

else if

  • Використовуючи конструкцію else if, ми можемо обробляти додаткові умови:

let num1 = 22

let num2 = 15

if num1 > num2{

     

    print("num1 більше ніж num2")

}

else if (num1 < num2){

 

    print("num1 менше ніж num2")

}

else{

 

    print("num1 та num2 рівні")

}

54 of 66

Тернарний оператор

  • Умовна операція, дуже схожа на умовний оператор вибору if else. Умовна операція "? :" називається тернарною операцією (тобто тримісна (має три операнди), єдина в мові).

  • Таким чином, якщо а > b, то надрукувати а, інакше надрукувати b. Тобто, програма друкує більше з чисел.
  • Використання умовної операції може в деяких випадках спрощувати код.

let a = 0, b = 2

a > b ? print(a) : print(b); // якщо а > b, то отримаємо a, інакше b

55 of 66

Конструкція switch

  • Конструкція switch/case схожа на конструкцію if/else, оскільки дає змогу обробити відразу кілька умов:

var num: Int = 22

 

switch num {

case 0:

    print(«Змінна дорівнює 0")

case 10:

    print(" Змінна дорівнює 10")

case 22:

    print(" Змінна дорівнює 22")

default:

    print("не вдалося розпізнати число")

}

56 of 66

fallthrough

  • Якщо ми хочемо, щоб також виконувався і наступний оператор case (або оператор default), то наприкінці попереднього блоку case слід використовувати оператор fallthrough:

let personInfo = ("Tom", 22)

switch personInfo {

case ("Bob", 33):

    print(«Ім’я: Bob, вік: 33")

case (_, 22):

    print(«Ім’я: \(personInfo.0) та вік: 22")

    fallthrough

case ("Tom", _):

    print(«Ім’я: Tom та вік: \(personInfo.1))

default:

    print("Інформація не розпізнана")

}

57 of 66

Цикл for-in

  • За допомогою циклу for-in ми можемо перебрати елементи колекції (масиви, множини, словники) або послідовності:

for item in 1...5 {

     

    print(item)

}

58 of 66

Цикл while

  • Оператор while перевіряє деяку умову, і якщо вона повертає true, то виконує блок коду:

var i = 10

while i > 0 {

     

    print(i)

    i-=1

}

59 of 66

Цикл repeat-while

  • Цикл repeat-while спочатку виконує один раз цикл, і якщо деяка умова повертає true, то продовжує виконання циклу:

var i = 10

 

repeat {

     

    print(i)

    i-=1

} while i > 0

60 of 66

Функції

  • Функція являє собою набір інструкцій, який має ім'я (ім'я функції) і може використовуватися повторно в різних місцях програми.

  • Для іменування функції застосовуються в принципі ті самі правила, що й під час іменування змінних. Для імені функції використовується режим camel case.

func printName(){

    print("Мене звати Олександр")

}

61 of 66

Параметри функції

  • Щоб не вказувати імена параметрів під час виклику функції, перед іменем параметра потрібно поставити підкреслення.
  • Між підкресленням і назвою параметра має бути пробіл:

func printInfo(_ name: String, _ age: Int){

 

    print(«Ім’я: \(name); вік: \(age)")

}

 

printInfo("Sofia", 19)   // Ім’я: Sofia; вік: 19

printInfo("Elijah", 35) // Ім’я: Elijah; вік: 20

62 of 66

Параметри функції

  • Кількість параметрів може бути довільною.
  • При виклику функції нам треба враховувати ім'я і тип параметрів. При виклику функції їй необхідно передати значення для всіх її параметрів за іменем. Тобто вказується ім'я параметра і через двокрапку його значення, до того ж, значення, що передається, має відповідати параметру за типом:

func printInfo(name: String, age: Int){

 

    print(«Ім’я: \(name); вік: \(age)")

}

 

printInfo(name: "Sofia", age: 19)   // Ім’я: Sofia; вік: 19

printInfo(name: "Elijah", age: 35)   // Ім’я: Elijah; вік: 20

63 of 66

64 of 66

65 of 66

66 of 66