Вы находитесь на странице: 1из 75

Сегодня

История

Почему Swift

Программа курса

Знакомство с Xcode. Demo

Введение в Swift

Лекция 2 - Swift основы


История
Разработка языка Swift началась в 2010 году Крисом Латтнером

Swift заимствовал идеи из «Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, и
еще из стольких многих языков, что сложно перечислить

2 июня 2014 года на конференции WWDC Swift был официально представлен


вместе с бесплатным руководством по использованию языка объёмом в 500
страниц

Версия Swift 1.0 была выпущена 9 сентября 2014 года, вместе с «Gold Master»
версией Xcode 6.0 для iOS.

8 июня 2015 года компания Apple объявила о выпуске новой версии Swift 2.0,
которая получила более высокую производительность
История

3 декабря 2015 года была выпущена бета версия Swift 3.0 с поддержкой
операционных систем OS X, iOS и Linux и лицензированная под открытой
лицензий Apache 2.0 license и с Runtime Library Exception

13 сентября 2016 представлена версия Swift 3.0

27 марта 2017 представлена версия Swift 3.1


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

Swift. A powerful open language that


lets everyone build amazing apps.
SWIFT
Swift  — это надёжный и интуитивно понятный язык программирования от Apple, при
помощи которого можно создавать приложения для iOS, Mac, Apple TV и Apple Watch. (Liux)

Целью проекта Swift является создание наилучшего доступного языка для


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

Для достижения этой цели разработчики считают, что написание кода на Swift должно
быть:

Безопасно Быстро Выразительно


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

Совместимость с Objective-C Проблемы с


Скорость разработки инструментами разработки

Производительность Время компиляции


Эмоджи в именах переменных
let 🐱 = “Cat”
Сложность курса
⭐⭐⭐⭐⭐
Программа курса
Первый модуль
Базовые принципы и конструкции программирования.

Работа с интерфейсом. Знакомство с основными контролами.

Навигация. Построение многооконного приложения.

Второй модуль
Работа с сетью и базой данных. Взаимодействие с сторонними фреймворками.


Архитектура приложения.
Написание итогового приложения
Первый модуль
1. Введение в язык. Коротко о мобильной разработке. Где и как используется Swift.
Знакомство с Xcode. Создание первого приложения.
2. Строки и символы. Опциоанльный тип. Базовые операторы. If. Switch. For.
——————————————
3. Коллекции (массивы, словари, наборы). Функции. Замыкания.
4. MVC. Классы, структуры и перечисления. Знакомство с Interface Builder. Создание элементарного
приложения с интерфейсом. IBAction. IBOutlet.
——————————————
5. Работа с интерфейсом. Autolayout, SizeClasses. StackView.
6. Views и их иерархия. Обработка жестов. Путь Безье.
——————————————
7. Расширения. Протоколы и делегирование. UIScrollView. Обработка ошибок.
8. Управление памятью. Замыкания. Углубление в Array, Set, Dictionary. Углубление в Xcode,
Debbuger
——————————————
9. Работа с элементами интерфейса. UIViewController. UIButton, UILabel, UITextField, Segues,
UITextView.
10. Таблицы. UITableView, UITableVIewController. UICollectionView.
——————————————
11. Навигация приложения. UISplitViewController,UITabBarController
12. Навигация приложения. Navigation Controller.
——————————————
13. Работа в команде. Git.
14. Alerts, Работа с сетью.
——————————————
15. Мультипоточность и асинхронность.
16. Повторение.
Второй модуль
17. CoreData. Введение.
18. CoreData. Работа с данными.
——————————————
19. Анимация.
20. Акселерометр и гироскоп. CoreMotion.
——————————————
21. Локализация и интернационализация
приложения.
22. Оповещения. Работа с различными сервисами.
——————————————
23. Работа с соцсетями. Работа с документацией.
24. CocoaPods. Использование. Коротко о
полезных библиотеках.
——————————————
25. UITableView. Углубление.
26. Мультимедиа: фото, музыка, видео.
——————————————
27. Паттерны проектирования.
28-32. Подведение итогов. Написание итогового
приложения.
Что такое iOS

Cocoa Touch Core OS


Управление
Media OSX Kernel
питанием
Mach 3.0
Keychain Access
Core Services BSD
Сертификаты
Sockets
Файловая Система
Core OS Безопасность
Bonjour
Что такое iOS

Cocoa Touch Core Services

Media Core Location


Collections
Net Services
Networking
Core Services Threading
Доступ к файлам
Preferences
Core OS SQLite
URL Utilites
Что такое iOS

Cocoa Touch Media

Media Core Audio JPEG, PNG, TIFF


Open AL PDF
Core Services Audio Mixing Quartz (2d)
Audio Запись Core Animation
Core OS
Media Playback OpenGL ES
Что такое iOS

Cocoa Touch Cocoa Touch

Media Multi Touch Оповещения


Core Motion Web View
Core Services View Иерархия Map Kit
Локализация Image Picker
Core OS
Контролы Камера
Платформа и компоненты
Инструменты Xcode

Язык разработки Swift, Objective-C

Фреймворки Foundation, UIKit, Core Data


Core Motion, Map Kit, …

Патерны
MVC
проектирования
Учебные материалы
Swift
https://developer.apple.com/library/content/documentation/Swift/
Conceptual/Swift_Programming_Language/

iOS
https://developer.apple.com/develop/

Куда бежать?
http://stackoverflow.com/questions/tagged/ios

http://stackoverflow.com/questions/tagged/swift

Туториалы
https://www.raywenderlich.com

http://nshipster.com
Демо
Hello World!

Playground
! константы и переменные
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

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

var str = ‘’Hello, playground’’


константы и переменные
let K = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = ‘’dogcow’'

var friendlyWelcome = "Hello!"


friendlyWelcome = ‘’Bonjour!’'
// friendlyWelcome сейчас ‘’Bonjour!’'

let languageName = "Swift"


languageName = "Swift++"
// ошибка компиляции - languageName не может
быть изменено
! Анотаци типа
var welcomeMessage: String

welcomeMessage = "Hello"

var red, green, blue: Double

var numberOfStoplights: Int = 4

numberOfStoplights += 2

let numberOfStoplights: Int = 4


numberOfStoplights += 2
Интерполяция строк \()

let numberOfStoplights: Int = 4

var population: Int


population = 5422

let townName: String = "Knowhere"

let townDescription =
"\(townName) has a population of \(population) and \
(numberOfStoplights) stoplights.»

print(townDescription) ‘’
Комментарии

//это однострочный комментарий

/*Это мультистрочный
комментарий*/
точка с запятой

let cat = "🐱"; print(cat)


// печатает 🐱
! Целочисленый тип
Int и Uint - и 32 и 64 разрядностью (зависит от
платформы)

let minValue = UInt8.min


// minValue равно 0, и является типом UInt8

let maxValue = UInt8.max


// maxValue равно 255, и является типом UInt8
! Типы с плавающей запятой

Double - для 64 битных чисел с плавающей запятой

Float - для 32

Double имеет точность не менее 15 десятичных цифр,


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

let meaningOfLife = 42
// meaningOfLife тип Int

let pi = 3.14159
// pi тип Double

let anotherPi = 3 + 0.14159


// anotherPi тип Double
Числовые литералы
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 в бинарнов
let octalInteger = 0o21 // 17 в восмеричном
let hexadecimalInteger = 0x11 // 17 в 16-ти
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
Целочисленные преобразования
let cannotBeNegative: UInt8 = -1
// UInt8 не может хранить негативные числа, выдаст
ошибку

let tooBig: Int8 = Int8.max + 1


// Int8 не может содержать числа больше чем
максимум

let twoThousand: UInt16 = 2_000


let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
! Преобразования типов
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine

let integerPi = Int(pi)


// стало 3
Псевдонимы типов (type Aliases)

typealias AudioSample = UInt16

var maxAmplitudeFound = AudioSample.min


// maxAmplitudeFound теперь 0
! Booleans

let orangesAreOrange = true


let onionsAreDelicious = false
! Кортежи (Tuples)
let http404Error = (404, "Not Found")
// http404Error является типом (Int, String), и
равны (404, "Not Found")

let (statusCode, statusMessage) = http404Error


print("The status code is \(statusCode)")

print("The status message is \(statusMessage)")

let (justTheStatusCode, _) = http404Error


print("The status code is \(justTheStatusCode)")
Кортежи (Tuples)
print("The status code is \(http404Error.0)")
print("The status message is \(http404Error.1)")

let http200Status = (statusCode: 200, description: "OK")

print("The status code is \(http200Status.statusCode)")

print("The status message is \(http200Status.description)")


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

let b = 10
var a = 5
a = b

let (x, y) = (1, 2)

Метод трех стаканов

а c
! Арифметические Операторы
1 + 2 // 3
5 - 3 // 2
2 * 3 // 6
10.0 / 2.5 // 4.0

"hello, " + "world"


// "hello, world"
! Оператор взятия по модулю
Оператор нахождения остатка

9 % 4 // равно 1
Унарные минус плюс операторы

let three = 3
let minusThree = -three // minusThree равно -3
let plusThree = -minusThree
// plusThree равно 3, или "минус минус три"

let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix equals -6

++Х++ + --Х--
! Оператор составного присвоения

var a = 1
a += 2
// a теперь 3
! Операторы сравнения
1 == 1 // true
2 != 1 // true
2 > 1 // true
1 < 2 // true
1 >= 1 // true
2 <= 1 // false

=== - выясняет указывают ли два экземпляра на


одну и туже ссылку

!== - не указывают ли два экземпляра на одну и


туже ссылку
! Логические операторы
NOT (!a)
AND (a && b)
OR (a || b)

a && b || c || !d

(a && b) || c || !d

a && (b || c || !d)
Лекция 2
! if
var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32
{
print("It's very cold.")
}
if temperatureInFahrenheit <= 32
{
print("It's very cold")
} else
{
print("It's not that cold")
}
! if
temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32
{
print("It's very cold")
}
else if temperatureInFahrenheit >= 86
{
print("It's really warm")
}
else
{
print("It's not that cold.")
}
Тернарный оператор ?:
if question {
answer1
} else { question ? answer1 : answer2
answer2
}

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight равно 90

let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
rowHeight = contentHeight + 50
} else {
rowHeight = contentHeight + 20
}
! For in
let names = ["Anna", "Alex", "Brian", «Jack"]

for name in names {


print("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

for index in 1...5 {


print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
For in
let base = 3
let power = 10
var answer = 1

for _ in 1...power {
answer *= base
}

print("\(base) to the power of \(power) is \(answer)")


// Напечатаем "3 to the power of 10 is 59049"
Range
..< …
struct Range<T> {
var startIndex: T
var endIndex: T
}

let array = [“a”,”b”,”c”,”d”]



let a = array[2...3] // [“c”,”d”]

let b = array[2..<3] // [“c”]

let c = array[6...8]

let d = array[4...1]
! Range
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}

let names = ["Anna", "Alex", "Brian", "Jack"]


let count = names.count

for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}

//for (i = 0.5; i <= 15.25; i += 0.3)

//0.5…15.25

for i in stride(from: 0.5, through: 15.25, by: 0.3) {


}
! While & Repeat-While
while condition { repeat {
statements statements
} } while condition

var index = 0 var index = 0

while index < 20 repeat


{ {
index += 1 index += 1
} } while index < 20

Главное отличие - что будет если задать индекс 30

var index = 30 ???


! String
let someString = "Some string literal value"

var emptyString = "" // empty string literal


var anotherEmptyString = String()

if emptyString.isEmpty {
print("Nothing to see here")
}

var variableString = "Horse"


variableString += " and carriage"
// переменная теперь "Horse and carriage"

let constantString = "Highlander"


constantString += " and another Highlander"
// ошибка
! (3) String и Character
for character in "Dog!🐶".characters {
print(character)
}
// D
// o
// g
// !
// 🐶
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)
// "Cat!🐱"

let string1 = "hello"


let string2 = " there"
var welcome = string1 + string2
// welcome = "hello there"

let exclamationMark: Character = "!"


welcome.append(exclamationMark)
// welcome = "hello there!"
! Сравнение строк
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These two strings are considered equal")
}
// Выведет "These two strings are considered equal"

// "Voulez-vous un café?" один символ с нарицанием


let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"

// "Voulez-vous un café?" нарицание и символ отдельно


let combinedEAcuteQuestion = "Voulez-vous un
caf\u{65}\u{301}?"

if eAcuteQuestion == combinedEAcuteQuestion {
print("These two strings are considered equal")
}
// Выведет "These two strings are considered equal"
Unicode и Спец символы
\0 \\ \t \n \r \" \’ \u{}
let dollarSign = "\u{24}" // $, Unicode U+0024
let blackHeart = "\u{2665}" // ♥, Unicode U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode U+1F496

var word = "cafe"


print("the number of characters in \(word)
is \(word.characters.count)")
// "the number of characters in cafe is 4"

word += "\u{301}" // нарицание, U+0301

// "the number of characters in café is 4"


! Switch
switch some value to consider {
case value 1:
respond to value 1
case value 2,
value 3:
respond to value 2 or 3
default:
otherwise, do something else
}

let someCharacter: String = "z"

switch someCharacter {
case "a":
print("The first letter of the alphabet")
case "z":
print("The last letter of the alphabet")
default:
print("Some other character")
}
Switch
let anotherCharacter: String = "a"

switch anotherCharacter {
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
}
Switch
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String

switch approximateCount {
case 0:
naturalCount = "no"
case 1..<5:
naturalCount = "a few"
case 5..<12:
naturalCount = "several"
case 12..<100:
naturalCount = "dozens of"
case 100..<1000:
naturalCount = "hundreds of"
default:
naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
Switch
let somePoint = (1, 1)

switch somePoint {
case (0, 0):
print("\(somePoint) is at the origin")
case (_, 0):
print("\(somePoint) is on the x-axis")
case (0, _):
print("\(somePoint) is on the y-axis")
case (-2...2, -2...2):
print("\(somePoint) is inside the box")
default:
print("\(somePoint) is outside of the box")
}
// на экране "(1, 1) is inside the box"
Switch
let anotherPoint = (2, 0)

switch anotherPoint {
case (let x, 0):
print("on the x-axis with an x value of \(x)")
case (0, let y):
print("on the y-axis with a y value of \(y)")
case let (x, y):
print("somewhere else at (\(x), \(y))")
}

let yetAnotherPoint = (1, -1)

switch yetAnotherPoint {
case let (x, y) where x == y:
print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
print("(\(x), \(y)) is just some arbitrary point")
}
! Switch
let someCharacter: String = "e"

switch someCharacter {
case "a", "e", "i", "o", "u":
print("\(someCharacter) is a vowel")
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
print("\(someCharacter) is a consonant")
default:
print("\(someCharacter) is not a vowel or a consonant")
}

let stillAnotherPoint = (9, 0)

switch stillAnotherPoint {
case (let distance, 0), (0, let distance):
print("On an axis, \(distance) from the origin")
default:
print("Not on an axis")
}
! перенос выполнения
• continue
• break
• fallthrough
• return
• throw

Continue
let numbers: [Int] = [0, 1, 2, 3, 4, 5]

for number in numbers {


if (number%2) == 0 {
continue
} else {
print("\(number)")
}
}
! перенос выполнения
Break
let numbers: [Int] = [0, 1, 2, 3, 4, 5]

for number in numbers {


if (number%2) == 0 {
break
} else {
print("\(number)")
}
}

let anotherCharacter: String = "a"

switch anotherCharacter {
case "a", "A":
print("The letter A")
default:
break
}
перенос выполнения
fallthrough
let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"

switch integerToDescribe
{
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}

print(description)
// "The number 5 is a prime number, and also an integer."
! Optional
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber is inferred to be of type "Int?", or
"optional Int"

var serverResponseCode: Int? = 404


// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

var surveyAnswer: String?


// surveyAnswer is automatically set to nil
? Так что же такое Optional
enum Optional<T>{ //<T> это generic как в массиве Array<T>
case none
case some(T)
}

!let x: String? = nil


let x = Optional<String>.none

let x: String? = “hello”


let x = Optional<String>.some(“hello”)
Как нам работать с Optional
Unwrapped - разворачивать, развертывать

Безопасное развертывание ч.1

if let constantName = someOptional {


statements
}

if let actualNumber = Int(possibleNumber) {


print("\"\(possibleNumber)\" has an integer value of \
(actualNumber)")
} else {
print("\"\(possibleNumber)\" could not be converted to an
integer")
}
// Prints ""123" has an integer value of 123"
Безопасное развертывание ч.2

if let firstNumber = Int("4"), let secondNumber = Int("42"),


firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"

if let firstNumber = Int("4") {


if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// Prints "4 < 42 < 100"
Optionals могут быть каскадными

var display: UILabel?


if let temp1 = display {
if let temp2 = temp1.text {
let x = temp2.hashValue
... }
}
if let x=display?.text?.hashValue{...} //x Int

let x=display?.text?.hashValue //x Int?


Optionals !

let possibleString: String? = "An optional string."


let forcedString: String = possibleString! // явно

let assumedString: String! = "An implicitly unwrapped


optional string."
let implicitString: String = assumedString // не явно

Если неявно развернутый optional параметр равен nil и вы пытаетесь


получить доступ к его обернутому значению, вы получите ошибку во время
выполнения программы. Результат будет таким же, если вы поместите
восклицательный знак после обычного optional параметра, который не
содержит значения.
Значение по умолчанию ??
let s: String? = ... // может быть nil

if s != nil {
display.text = s
} else {
display.text = “ “
}
... можно записать так ...
display.text = s ?? “ “
Задания
var population : Int - это население города
Вывести на экран тип города (хутор, село, ПГТ, город)
тремя способами в зависимости от значения
переменной.
1. Использовать последовательные if
2. else if конструкция
3. switch

Используя тернарный оператор вывести на экран


ребенок вы или нет.
Задания
Составить и запрограммировать минимум 5 типов
кортежей и 3 примера к ним. Вывести на экран
содержимое всех кортежей.
Например: тип Питомец (возраст, имя, тип)
let myCat = (age:6 ,name:"Borya", type: "cat")

Используя логические операторы ! || && составить


условия для ситуцаий:
1. выйти из дома
2. встать с кровати
3. пойти в магазин
Например:
var goOut = (noRain && noSnow) || someoneIsWaiting
Задания
Вычислить факториал 5 (5!) в циклах (for in, while,
repeat while) и вывести на экран результат

Вывести на екран все високосные года с 1587 по 2017


( условия каждого 4, 100, 400 года)

* Поменять местами значения переменных 



var а = 5
var b = 6 

используя только эти две переменные
Задания
Детально изучить лекцию, учебные материалы и
ссылки на внешние ресурсы

Повторить и запомнить как работать с Optional

Вам также может понравиться