Vapor
Vapor пример
import Vapor let drop = Droplet() drop.get("/"){ request in var items:[String]=[String]() items.append("Andrey") items.append("Yuriy") items.append("Kirill") items.append("Alexey") items.append("Alexandr") return try JSON(node: items) } drop.run()
Команда сборки
vapor build
на этапе сборки мы можем увидеть ошибки, если мы накосячили
vapor run
Кастомный контрол
синус + косинус
тригонометрия в iOS
sinus
cosinus
π rad = 180°
1° = π/180° = 0.005555556π = 0.01745329252 rad
radians = degrees × π / 180°
Алгоритмы
Что должен знать Junior
язык, ООП, Паттерны
Сортировка
- Поразрядная
- Быстрая
- Пирамидальная
- Слиянием
- Пузырьком + модификации
- Вставками
- Шелла
- Выбором
- FAQ
- Топологическая
- Быстрая с составными ключами
Поиск. Строки и последовательности
- Точный подстроки в строке
- Нечеткий поиск
- Проверка на подпоследовательность
- Общие подпоследовательности. Дистанция
- Поиск hcs, lis, his
- Максимальная повторяющаяся подстрока
- Общие элементы двух массивов
- Бинарный поиск
- Интерполяционный поиск
- Бинарный поиск с определением ближайших узлов
- Частный случай lis
Структуры данных
- Очереди
- Кучи
- Двоичная куча
- Введение в абстрактные структуры
- АВЛ-деревья
- Красно-черные деревья
- Деревья со случайным поиском
- Слоёные списки (скип-списки)
- Хеш-таблицы
- Б, Б+ и Б++ деревья
- Обходы бинарных деревьев
- Hashed Array Trees[Перевод]
- StringBTree
- Triangle Mesh
Кто кого SOLID ?
Обстоятельства переменчивы, принципы — никогда
Онорэ Де Бальзак
Скрипт увеличивающий версию билда
Скрипт который инкрементирует версию билда при каждой сборке
# Скрипт увеличивающий версию билда buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}") buildNumber=$(($buildNumber + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
Добавляем скрипт в фазы сборки проекта
keywords
version
build
Задержка для SplashScreen на N секунд
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let n = 4.0 Thread.sleep(forTimeInterval: n) return true }
Swift: Случайное число
// random let randomValue:UInt32 = (arc4random_uniform(100)) // от 0 до 100
Нашёл клёвую конструкцию
typealias Animation = (TimeInterval, ()->Void)
let animation: Animation = (5.0, { })
internal class Node<T> { var data: T var next: Node<T>? init(data: T){ self.data = data } } internal struct Queue<T> { var first, last: Node<T>? mutating func dequeue() -> T? { let pop = first?.data first = first?.next if first == nil { last = nil } return pop } mutating func enqueue(data: T){ if last == nil { first = Node(data: data) last = first } else { last?.next = Node( data: data) last = last?.next } } }
var animations: Queue = Queue<Animation>()
Анимация прямо в playground.
Чтобы поиграться с анимацией не создавая проект приложения достаточно использовать playground
import UIKit import PlaygroundSupport let containerView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 375.0, height: 667.0)) let circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)) circle.center = containerView.center circle.layer.cornerRadius = 25.0 let startingColor = UIColor(red: (253.0/255.0), green: (159.0/255.0), blue: (47.0/255.0), alpha: 1.0) circle.backgroundColor = startingColor containerView.addSubview(circle); let rectangle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50.0)) rectangle.center = containerView.center rectangle.layer.cornerRadius = 5.0 rectangle.backgroundColor = UIColor.white containerView.addSubview(rectangle) UIView.animate(withDuration: 2.0, animations: { () -> Void in let endingColor = UIColor(red: (255.0/255.0), green: (61.0/255.0), blue: (24.0/255.0), alpha: 1.0) circle.backgroundColor = endingColor let scaleTransform = CGAffineTransform(scaleX: 5.0, y: 5.0) circle.transform = scaleTransform let rotationTransform = CGAffineTransform(rotationAngle: 3.14) rectangle.transform = rotationTransform }) PlaygroundPage.current.liveView = containerView
Зарядка для глаз
Ребята молодцы, отличная зарядка-разминка для глаз, очень рекомендую
Тут
Segue
очень полезный метод для того чтобы передать данные в любой ViewController
override func prepare(for segue: NSStoryboardSegue, sender: Any?) { if segue.identifier == "segueAdd" { print("segue Add") // тут передаём всё что нам нужно в ViewController который будет вызван при переходе } if segue.identifier == "segueEdit" { print("segue Edit") } }
Стоит использовать в связке с presentingViewController для конфигурации родительского контроллера...
presentingViewController.someProps = someValues
Swift: динамическое создание класса
protocol Runable { init() } class AdvHandler: Runable{ required init(){ } func run(){ print("run class is runnable()") } } func createInstance<T>(typeThing:T.Type) -> T where T:Runable { return typeThing.init() }
Смысл этого подхода в том что метод createInstance понятия не имеет что за класс он создаёт для клиента.
это открывает большие возможности абстрагирования.
Повышая уровень абстракции.
Применение
let a = createInstance(typeThing: AdvHandler.self) as AdvHandler a.run()
Swift: IB Free
Synx утилита для реорганицации проекта на xcode
Synx утилита на ruby
synx project.xcodeproject/
macOS: Модальное окно из NSViewController
Модальное окно из NSViewController
let aboutVC = self.storyboard?.instantiateController(withIdentifier: "AboutVC") as! NSViewController self.presentViewControllerAsModalWindow(aboutVC )
SOLID
- Single responsibility,
- Open-closed,
- Liskov substitution,
- Interface segregation
- Dependency inversion.
Single responsibility,
Принцип одной ответственности.
Open-closed
Модули, классы должны быть открыты для расширения и закрыты для изменения
Liskov — принцип подстановки
Подклассы не могут замещать поведение базового класса.
Подтипы должны дополнять базовые типы.
Собака не должна начать летать, вместо того чтобы лаять.
Interface segregation.
Разделение на интерфейсы.
Лучше иметь много маленьких интерфейсов которые отвечают за что-то одно, чем один большой универсальный интерфейс.
Dependency inversion. — Инверсия зависимостей
Модули верхних уровней не должны зависеть от модулей нижних уровней, и модули должны зависеть от интерфейсов а не от их конкретной реализации