Git Hub

.iOS

коротко

Итерация по enum

6 ноября, 19:49
enum State {
    case none
    case one
    case two
}

Конформим State под протокол CaseIterable

extension State: CaseIterable {}

После этого мы можем итерироваться

State.allCases.forEach {
    print($0)
}

Интересные Callback'и

13 августа, 21:41

Объявляем тип для callback замыкания

typealias RegStateCallbackType = @convention(c) (_ accountId: pjsua_acc_id) -> Void
var onRegStateCallback: RegStateCallbackType?

И можно тогда заюзать следующим образом

endpointCfg.cb.on_reg_state = onRegStateCallback
C   Swift

Swift String to C char *

14 июня 2019, 0:51
void mi_connect_device(char *device_name);
func connect(to device: String) {
        device.withCString {
            let int8Pointer = UnsafeMutablePointer<Int8>(mutating: $0)
            mi_connect_device(int8Pointer)
        }
    }
C   Swift

Время сборки в Xcode

1 июня 2019, 16:19

Хочу видеть время сборки проекта

Вариант 1:

defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES

Вариант 2:

в папке с проектом выполнить в консоле комманду

time xcodebuild

Запуск из консоли

xcodebuild -workspace CallKitExample.xcworkspace -scheme CallKitExample -showBuildTimingSummary

RxSwift кастомная View'ха

7 марта 2019, 4:03

Пишем своё расширение кастомной вьюхи.

import UIKit
import RxSwift
import RxCocoa


class CustomView: UIControl {
    
    var value: Int = 0 {
        didSet { sendActions(for: .valueChanged)}
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
    }
    
    func toggle() {
        if value == 0 {
            backgroundColor = .green
            value = 1
        } else {
            backgroundColor = .red
            value = 0
        }
    }
    
}

extension Reactive where Base: CustomView {
    var value: ControlProperty<Int> {
        return base.rx.controlProperty(editingEvents: UIControlEvents.valueChanged, getter: { customView in
            return customView.value
        }, setter: { customView, newValue in
            customView.value = newValue
        })
    }
}

И теперь использовать можно так

customView.rx.value
            .subscribe(onNext: { value in
                print("changed my value -> \(value)")
            })
            .disposed(by: bag)

Login screen

1 марта 2019, 15:03

Реализовал Login screen на VIPER, хотя в несколько облегчённом варианте, скорее всего ещё допилю взаимодействие между модулями. Router — > Router + Presenter

Мои исходники

VIPER
V — View (Views + ViewControllers)
I — Interactor — бизнес логика модуля
P — Presentor (ViewModels and prepare)
E — Entities — (Models)
R — Router

Обновил вид диаграммера

24 февраля 2019, 20:26

Изменил вид PopupColorPickerView

Следующие слова из статьи с New York Times

23 февраля 2019, 0:26

Слова:

  1. along — вместе
  2. being — являющийся
  3. accused — обвиняемый
  4. whistling — свистящий
  5. kindle — зажигать
  6. crumbling — рушиться
  7. wither — увядать
  8. apart — кроме
  9. neglected — пренебрегли
  10. slaughter — забой скота

Источник

Мои попытки учить английский самостоятельно.

22 февраля 2019, 1:00

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

Попробую каждый день читать быстро 5-10 минут по статье из New York Times или The Times

Взял статью.
Решил выписывать неизвестные обороты из неё.

They drew blood from him
Они вытянули кровь из него

caught up in a vast Chinese campaign of surveillance and oppression.
втянутый в обширную китайскую кампанию слежки и угнетения.

Посмотрим смогу ли я продержаться хотя бы неделю.

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

Список слов:
Dreamy day — мечтательные дни

Swift KVO

21 января 2019, 23:25

Модель

import Foundation

@objc class Card: NSObject {
    
    @objc dynamic var life: Int = 0
    @objc dynamic var atack: Int = 0
    @objc dynamic var defense: Int = 0
    
}

Задаём переменную для invalidate()

var cardObserver: NSKeyValueObservation?

Подписываемся на изменения и вешаем обработчик

let card = Card()
        cardObserver = card.observe(\Card.life, options: .old, changeHandler: { card, change in
            print("Changed life value \(card.life) -> ", change.oldValue ?? -1)
        })

Соответсвенно когда мы меняем значение переменной `life` то вызывается наш обработчик

card.life = 12
card.life = 1
card.life = 34

Swift: setTimeOut

13 января 2019, 1:52
DispatchQueue.main.asyncAfter(deadline: .now() + 0.600) {
     // some code
}

RxSwift: создаём реактивное расширение

12 января 2019, 13:34

Расширение

extension Reactive where Base: NSView {
    
    public var alphaValue: ControlProperty<CGFloat> {
        
        let source = self.observeWeakly(CGFloat.self, "alphaValue", options: [.initial, .new])
            .filter { $0 != nil }.map { $0! }
            .takeUntil(deallocated)
        
        let observer = Binder<CGFloat>(base) { control, value in
            control.alphaValue = value
        }
        
        return ControlProperty(values: source, valueSink: observer)
    }
    
}

Применение

подписываемся на изменения переменной

view.rx.alphaValue.subscribe(onNext: { value in
                print("val->", value)
            })
            .disposed(by: disposeBag)

меняем значение по слайдеру

slider.rx.value.subscribe({ [weak self] item in
                let newValue = Int( item.element  ?? 0 )
                self?.view.alphaValue = newValue
            })
         .disposed(by: disposeBag)

RxSwift: Создание реактивной переменной

12 января 2019, 13:22

Код должен быть прозрачным

import RxSwift

Способ 1

Создаём переменную

var hitPoints = Variable<Int>(10)

Изменение значение переменной

card.hitPoints.value = hp

Подписка на изменение

card.hitPoints.asObservable().subscribe(onNext: { [weak self] value in
            print("Your hit points ->", value)
            self?.labelHitPoints.stringValue = "\(value)"
        })
            .disposed(by: bag)

Способ 2

Создаём переменную

var rxMana = BehaviorRelay<Int>(value: 0)

Вешаем обработчик на реактивную переменную

self.rxMana.subscribe(onNext: { value in
            print("Your level mana ->", value)
        })
            .disposed(by: disposeBag)

Ну и где-нить меняем значение переменной

rxMana.accept(newValue)

Как передать в vue filter контекст компоненты

14 ноября 2018, 20:01

Задача

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

Решение

в шаблоне компоненты

:value="value | filterNumber(this)"

в компоненте

...
    filters: {
              filterNumber: function(value, self) {
                  console.log("this->", self.propName)
                  return value;
              }
            },
    ...

UX design

25 сентября 2018, 13:05

Один из основных навыков UX-дизайнера — это умение рассказывать о сложных вещах простыми словами.
Делая UX простым, вы сможете влиять на окружающих.

IoT Asset Tracker

25 сентября 2018, 11:22

IoT Asset Tracker

Отслеживание состояния партии готовой продукции от места производства до конечного заказчика

Стек:

  • MapKit,
  • Swift,
  • MVVM,
  • Realm,
  • Moya.

MPM

11 сентября 2018, 14:35

Real-time Production Management

Это приложение предназначенное для решения задач

  1. Мониторинг текущего производственного процесса,
  2. Планирования изменений и связанных с этим затрат,
  3. Анализа и оптимизации процесса выпуска продукции.

Стек:

  • Swift,
  • MVVM,
  • Realm,
  • Moya,
  • RxSwift,
  • GCD.

Посмотреть все сим-линки в системе

28 августа 2018, 11:27
find / -type l -ls

Посмотреть все изменёёные файлы за последние N минут

find . -type f -mmin -30

Swift

16 июня 2018, 18:29

Разница между датами

func calcDiff(between start: String, and end: String ) -> String {
        if
            let endTime = Date.from(end),
            let startTime = Date.from(start)
        {
            return Calendar.current.date(from: Calendar.current
                .dateComponents([.hour, .minute], from: startTime, to: endTime))?
                .formatted("HH:mm") ?? "--:--"
        }
        
        printError("Can't convert time ")
        return  "--:--"
    }

Collection with safe index

15 июня 2018, 23:41
extension Collection where Indices.Iterator.Element == Index {
    subscript(safe index: Index) -> Iterator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
Ctrl + ↓ Ранее