CSS для UIKit
import UIKit struct ButtonStyles { static var circle: Decoration<UIButton> { return { (view:UIButton) in let size = max(view.bounds.width, view.bounds.height) view.layer.cornerRadius = size/2 view.layer.masksToBounds = true } } }
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 )

