Свифт
или как я учил новый язык


– Новый
– Разработан в Эпл
– Открытый
– Быстрый
– Выразительный
Типы данных
var variable1 = true // Bool
var variable2 = 13 // Int
var variable3 : UInt = 42 // UInt
var variable4 = 1.618 // Double
var variable5 : Float = 1.2 // Float
var variable6 = "Привет" // String
var variable7 = nil // Пампам! Не валидно :(
var variable8 = (1, "A") // (Int, String)
Переменные
var x = "FOO"
x = "BAR" // OK
let y = "FOO"
y = "BAZ" // Ошибка компиляции, y – константа

Пример
var strings = ["FOO", "BAR"]
strings.reverse()
strings[0]

Общее между JS и Swift
- Синтаксис;
- REPL;
- Ощущение того, что код – интерпретируемый.
Отличия между JS и Swift
- Компилируемый язык (LLVM);
- Функциональные концепты;
- Пока ещё не работает в браузере;
-
Функциональность, которой нет в JS 😂
Функциональность, которой нет в JS
Опционал / Optional
Опционал
var x : Int?
x = Int("abc") // не Int, получим nil
x = Int("123") // 123
Опционал имеет свой собственный тип
var y = Int("123")
var x = 123 // Int
var y = Int("123") // Int?
Int() возвращает тип Int?, почему y Int?, а не Int
Получение значения
var str : String = "Первый"
var str2 : String? = "пример"
var fullStr = str + " " + str2

var fullStr = str + " " + str2!
if let tmp = str2
{
fullStr = str + " " + str2!
}
else
{
fullStr = str
}
Правильное получение
Сказать компилятору явно
Использовать связывание
Кортежи / Tuples
var coordinates = (10, 20)
print("Координаты x:\(coordinates.0) y:\(coordinates.1)")
Кортежи
Обращение по индексу
var coordinates = (x: 10, y: 20)
print("Координаты x:\(coordinates.x) y:\(coordinates.y)")
Именование при создании
var (x, y) = (10, 20)
print("Координаты \(x), \(y)")
Декомпозиция в переменные
var (_, _, z) = (10, 20, "Мир")
print("Привет, \(z)")
Можно игнорировать переменные при декомпозиции
Switch
var tasksNum = 6
switch (tasksNum)
{
case 0, 1:
print("достаточно")
case 2..<5:
print("нормально")
case 5..<10:
print("много")
case 10...100:
print("слишком много")
default:
print("я же не робот!")
}
Switch
var person = ("Иван", 23, "Россия")
switch (person)
{
case (let name, _, "Россия"):
print("Привет, \(name)")
case (_, let age, _) where age > 60:
print("Добрый день, господин")
case let (name, age, country):
print("Привет, я \(name), мне \(age), \(country)")
}
Switch с кортежами
Functions
func functionName(param1: Type, param2: Type) -> ReturnType {
// тело
}
Синтаксис
func add(x: Int, y: Int) -> Int {
return x + y
}
add(5, y:10)
/******/
func add(x: Int, _ y: Int) -> Int {
return x + y
}
add(5, 10)
/******/
func add(thisNumber x: Int, andThisNumber y: Int) -> Int {
return x + y
}
add(thisNumber: 5, andThisNumber:10)
Параметры
func add(a:Int, _ b:Int) -> Int {
return a + b
}
var addingFunction = add
addingFunction(1, 2)
Функции – это значения
add, addingFunction имеет тип (Int, Int) -> Int
А значения имеют тип
Closures
var add = { (x:Int, y:Int) -> (Int) in
x + y
}
add(1,2)
Функции – это именованные замыкания
func add(x: Int, y: Int) -> Int {
return x + y
}
add(5, y:10)
func doMath(c : (Int, Int) -> Int) -> Int {
return c(1,2)
}
doMath({ (x:Int, y:Int) -> Int in return x + y })
doMath() { (x:Int, y:Int) -> Int in return x + y }
doMath { (x:Int, y:Int) -> Int in return x + y }
Замыкания можем передавать в параметры
Перечисления
Особенности
- Могут иметь вычисляемые поля
- Могут иметь методы конструкторы/инициализаторы
- Могут быть расширяемыми
enum Size {
case Small, Medium, Large
}
var x = Size.Small
var y = .Small
print(y) // напечатает "Small"
Синтаксис
enum Response {
case Success
case Error(Int, String)
}
var r1 = Response.Success
var r2 = Response.Error(404, "Not Found")
switch (r2)
{
case .Success:
print("Всё супер!")
case .Error(let code, let msg):
print("Ошибка \(code): \(msg)")
}
Хранение кастомных значений
Структуры и классы
Структура
- Свойства
- Методы
- Расширяемая
- Может принимать протокол
- Метод инициализатор
- По значению
Класс
- Свойства
- Методы
- Расширяемый
- Может принимать протокол
- Метод инициализатор
- По ссылке
- Наследование
- Приведение типа во время выполнения
- Метод деструктор
Массивы, словари и строки – структуры и ссылаются по значению
Generic
Protocol
OOП...
Swift не JS,
но бояться его не стоит
Свифт
By evilj0e
Свифт
- 53