Vuex
Vuex — это паттерн управления состоянием и библиотека для приложений на Vue.js. Он служит центральным хранилищем данных для всех компонентов приложения и обеспечивает предсказуемость изменения данных при помощи определённых правил.
Getters
Функции возвращающие значения из store. Используйте их, когда над значениями в store надо произвести какие то действия прежде чем передать их вызвавшему. (Вы так же можете считывать напрямую.)
Mutations
Функции которые коммитят изменения в store. Могут быть использованы для пред-обработки значений перед сохранением. Вы так же можете изменять state напрямую
Actions
Функции похожие на мутации. исключая коммиты данных во время асинхронных таксов. Они не являются обязательными, но вы должны привыкнуть использовать их всякий раз, когда присутствуют мутации.
Жизненный цикл Vuex (Life Cycle)
пример использования Getters
<template> <div> <div>Value = {{ getMyProperty }}</div> <div>Value = {{ getStoredProp }}</div> </div> </template> <script> import { mapGetters } from 'vuex'; export default { computed: { ...mapGetters([ 'getMyProperty' ]), // or, without helper... getStoredProp: () => { return this.$store.getters.getMyProperty; } } } </script>
пример использования Mutations
<template> <div> <button @click="setMyProperty(22)">Set to 22</button> <button @click="setThatProp(0)">Reset to 0</button> </div> </template> <script> import { mapMutations } from 'vuex'; export default { methods: { ...mapMutations([ 'setMyProperty' ]), // Or without helper... setThatProp( value ) { this.$store.commit( 'setMyProperty', value ); } } } </script>
пример использования Actions
<template> <div> <button @click="doChangeMyProperty(5)">Change me to 5</button> </div> </template> <script> import {mapActions} from 'vuex'; export default { methods: { ...mapActions([ 'doAsyncChangeMyProperty', ]), // Or without helper... doThatThing( value ) { this.$store.dispatch('doAsyncChangeMyProperty', value); } } } </script>
двусторонний биндинг
<template> <div> <input type="text" v-model="my_property"/> {{ my_property }} </div> </template> <script> export default { computed: { my_property: { get() { return this.$state.getters.my_property; }, set( value ) { this.$state.dispatch('setMyProperty', value); } } } } </script>
On Store Object
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export const store = new Vuex.Store({ state: { my_property: 47 }, getters: { getMyProperty: state => { return state.my_property; } }, mutations: { setMyProperty: ( state, payload ) => { state.my_property = payload; } }, actions: { doChangeMyProperty: ( context, payload ) => { context.commit('setMyProperty', payload); }, doAsyncChangeMyProperty: ( { commit }, payload ) => { // Using a timeout, but any async operation can go here setTimeout(function () { commit('setMyProperty', payload); }, 1000); } } });
On Modules
const moduleA = { state: { ... }, mutations: { ... }, actions: { ... }, getters: { ... } } const moduleB = { state: { ... }, mutations: { ... }, actions: { ... } } const store = new Vuex.Store({ modules: { a: moduleA, b: moduleB } }) store.state.a // moduleA's state store.state.b // moduleB's state
Статья о lldb
Debugging Swift code with LLDB
ll Debug
https://medium.com/flawless-app-stories/debugging-swift-code-with-lldb-b30c5cf2fd49
Хранимые переменные в экстеншенах
Stored properties in swift extensions
protocol PropertyStoring { associatedtype T func getAssociatedObject(_ key: UnsafeRawPointer!, defaultValue: T) -> T } extension PropertyStoring { func getAssociatedObject(_ key: UnsafeRawPointer!, defaultValue: T) -> T { guard let value = objc_getAssociatedObject(self, key) as? T else { return defaultValue } return value } } protocol ToggleProtocol { func toggle() } enum ToggleState { case on case off } extension UIButton: ToggleProtocol, PropertyStoring { typealias T = ToggleState private struct CustomProperties { static var toggleState = ToggleState.off } var toggleState: ToggleState { get { return getAssociatedObject(&CustomProperties.toggleState, defaultValue: CustomProperties.toggleState) } set { return objc_setAssociatedObject(self, &CustomProperties.toggleState, newValue, .OBJC_ASSOCIATION_RETAIN) } } func toggle() { toggleState = toggleState == .on ? .off : .on if toggleState == .on { // Shows background for status on } else { // Shows background for status off } } } let a = UIButton() print(a.toggleState) a.toggleState = .on print(a.toggleState)
Источник: https://marcosantadev.com/stored-properties-swift-extensions/
Сборка билда
- — переходим в дев
- — создаём релизную ветку
- — меняем версию
- — коммитим и пушим ветку
- — собираем билд и кладём его в Fabric
переходим в дев
создаём релизную ветку
git flow release start 0.4
меняем версию коммитим и пушим ветку собираем билд и кладём его в Fabric
React JS fetch from api
fetch("/api/v1/periodic/") .then((response) => response.json()) .then((responseJson) => { this.list = responseJson.elements; this.state = { displayedElements: responseJson.elements, elements: responseJson.elements }; this.setState(this.state); return responseJson.elements; }) .catch((error) => { console.error(error); });
RxAlamofire + SwiftyJSON
import RxAlamofire import SwiftyJSON func load() { let host = "http://chemnote.ru/api/v1/periodic/" guard let url = host.url else { return } RxAlamofire.requestJSON(.get, url) .bind { (r, json) in let dic = JSON(json) for (_,element) in dic { let symbol: String = element["symbol"].stringValue PeriodicTable.elements.append(Element(with: symbol)) print("el: \(symbol) ") } } .disposed(by: bag) }
md5 на swift
import CryptoSwift extension String { func md5() -> String { let bytes:Array<UInt8> = Array(self.utf8) let md5hash = bytes.md5().toHexString() return md5hash } }
Printable
extension Element: CustomStringConvertible { var description : String { return "element: \(symbol)" } }
Интеграция SpriteKit
шаг первый
в ViewController пишем
шаг второй в stoyboard у главной view указываем тип SKView
For Base Controller
Size Of Screen
var screenSize: CGSize { return UIScreen.main.bounds.size }
Пишем плагин Sketch
var sketch = context.api() var doc = sketch.selectedDocument var page = doc.selectedPage var group = page.newGroup({frame: new sketch.Rectangle(0, 0, 200, 200), name: "test"}) var rect = group.newShape({frame: new sketch.Rectangle(50, 50, 100, 100), name: "cell1" })
var onRun = function(context) { var sketch = context.api() var doc = sketch.selectedDocument var page = doc.selectedPage var count = 5 var size = 320/count var group = page.newGroup({frame: new sketch.Rectangle(0, 0, 320, size), name: "test"}) var colors = ["#ff000090","#00FF00FF"] for(i = 0; i < count; i++){ var rect = group.newShape({frame: new sketch.Rectangle(i*size, 0, size, size), name: "cell1",fills: ["#00FF0090"], borders: ["#303030FF"] }) } };
Версия приложения
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String let build = Bundle.main.infoDictionary?["CFBundleVersion"] as! String
пишем расширение
extension UIApplication { func getVersion() -> String { let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String let build = Bundle.main.infoDictionary?["CFBundleVersion"] as! String return "\(version).\(build)" } }
применение
... UIApplication.shared.getVersion() ...
Date
Дату из текущей + N дней
extension Date { func dateFromDays(_ days: Int) -> Date { return (Calendar.current as NSCalendar).date(byAdding: .day, value: days, to: self, options: [])! } }
let startDate = Date() let endDate = startDate.dateFromDays(+10)
Custom action in UITableViewCell

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in print("share button tapped") } share.backgroundColor = UIColor.blue let deleteAction = UITableViewRowAction(style: .default, title: "Del") {action, index in self.deleteRow(index) } deleteAction.backgroundColor = .red return [deleteAction, share] }
Realm
let uiRealm = RealmHelper.shared if let currentTaskList = self.taskList { try! uiRealm.write { ()->Void in currentTaskList.tasks.append(newTask) } }
SnapKit
func setupConstraints(){ uiLogo.snp.makeConstraints{ set in set.width.equalTo(AppStyles.About.logoSize) set.height.equalTo(AppStyles.About.logoSize) set.top.equalToSuperview().offset(AppStyles.About.offsetTop) set.centerX.equalToSuperview() } uiVersion.snp.makeConstraints{set in set.top.equalTo(uiLogo.snp.bottom).offset(AppStyles.About.offetBottom) set.centerX.equalToSuperview() } uiBack.snp.makeConstraints{make in make.width.equalTo(AppStyles.About.backSize) make.height.equalTo(AppStyles.About.backSize) make.centerX.equalToSuperview() make.bottom.equalToSuperview().offset(-AppStyles.About.offetBottom) } }
