Git Hub
коротко
Ctrl + ↑ Позднее

Vuex

28 сентября 2017, 12:41

Vuex — это паттерн управления состоянием и библиотека для приложений на Vue.js. Он служит центральным хранилищем данных для всех компонентов приложения и обеспечивает предсказуемость изменения данных при помощи определённых правил.

Gett­ers

Функции возвращающие значения из store. Используйте их, когда над значениями в store надо произвести какие то действия прежде чем передать их вызвавшему. (Вы так же можете считывать напрямую.)

Muta­tions

Функции которые коммитят изменения в store. Могут быть использованы для пред-обработки значений перед сохранением. Вы так же можете изменять state напрямую

Acti­ons

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

Жизненный цикл 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

24 сентября 2017, 17:47

Хранимые переменные в экстеншенах

4 сентября 2017, 12:53

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/

Сборка билда

30 августа 2017, 11:37
  1. — переходим в дев
  2. — создаём релизную ветку
  3. — меняем версию
  4. — коммитим и пушим ветку
  5. — собираем билд и кладём его в Fabric

переходим в дев

создаём релизную ветку

git flow release start 0.4
меняем версию 
коммитим и пушим ветку
собираем билд и кладём его в Fabric

React JS fetch from api

26 августа 2017, 1:32
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);
                });

Жизненный цикл SpriteKit

18 августа 2017, 11:46

RxAlamofire + SwiftyJSON

27 июля 2017, 19:40
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

24 июля 2017, 18:22
import CryptoSwift

extension String {
    
    func md5() -> String {
        let bytes:Array<UInt8> = Array(self.utf8)
        let md5hash = bytes.md5().toHexString()
        return md5hash
    }
    
}

Printable

17 июля 2017, 14:12
extension Element: CustomStringConvertible {
    var description : String {
        return "element: \(symbol)"
    }
}

Интеграция SpriteKit

12 июля 2017, 12:12

шаг первый
в ViewController пишем

шаг второй в stoyboard у главной view указываем тип SKView

For Base Controller

5 июля 2017, 14:58

Size Of Screen

var screenSize: CGSize {
        return UIScreen.main.bounds.size
    }

Код Стайл

3 июля 2017, 11:53

Код Стайл

Код Стайл

Пишем плагин Sketch

21 июня 2017, 4:32
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"] })
}
};

Версия приложения

19 июня 2017, 15:47

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

16 июня 2017, 18:25

Дату из текущей + 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

15 июня 2017, 23:59

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

14 июня 2017, 13:36
let uiRealm = RealmHelper.shared
                if let currentTaskList = self.taskList {
                    try! uiRealm.write { ()->Void in
                          currentTaskList.tasks.append(newTask)
                    }
                }

NFC Reader

14 июня 2017, 9:43
https://github.com/hansemannn/iOS11-NFC-Example

SnapKit

14 июня 2017, 2:03

https://medium.com/cocoaacademymag/how-to-write-auto-layout-constraints-with-snapkit-in-ios-c5f95c7c695d

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)
        }
    }
Ctrl + ↓ Ранее