Skip to content

Instantly share code, notes, and snippets.

View stinger's full-sized avatar

Ilian Konchev stinger

View GitHub Profile
@stinger
stinger / dynamicMemberLookup.swift
Created June 12, 2018 13:09
Swift 4.2 dynamicMemberLookup example
@dynamicMemberLookup
class Person {
let name: String
let age: Int
private let details: [String: String]
init(name: String, age: Int, details: [String: String]) {
self.name = name
self.age = age
self.details = details
@stinger
stinger / Bindings.swift
Last active October 18, 2018 11:25
KVO-driven model bindings
extension NSObjectProtocol where Self: NSObject {
func observe<Value>(_ keyPath: KeyPath<Self, Value>, onChange: @escaping (Value) -> ()) -> NSKeyValueObservation {
return observe(keyPath, options: [.initial, .new]) { _, change in
// TODO: change.newValue should never be `nil`, but when observing an optional property that's set to `nil`, then change.newValue is `nil` instead of `Optional(nil)`. This is the bug report for this: https://bugs.swift.org/browse/SR-6066
guard let newValue = change.newValue else { return }
onChange(newValue)
}
}
func bind<Value, Target>(_ sourceKeyPath: KeyPath<Self, Value>, to target: Target, at targetKeyPath: ReferenceWritableKeyPath<Target, Value>) -> NSKeyValueObservation {
@stinger
stinger / DataLoading.swift
Created April 3, 2018 20:40
Data loading using protocols
import UIKit
import PlaygroundSupport
enum CoreError: Error, LocalizedError {
case unknown
var errorDescription: String? {
switch self {
case .unknown:
return "Unknown error occured"
@stinger
stinger / InfinityLoader.swift
Created March 23, 2018 08:18
InfinityLoader swift demo
import UIKit
import PlaygroundSupport
public class InfinityLoader: UIView {
let anim = CAAnimationGroup()
//// Drawing Methods
lazy var path: UIBezierPath = {
@stinger
stinger / Swift4CodableDates.swift
Created August 21, 2017 13:57
Swift 4: Codable dates
import Foundation
struct LocationData: Codable {
var city: String
var country: String
var address: String?
}
struct Item: Codable {
var name: String
var fetchedResultsProcessingOperations: [NSBlockOperation] = []
private func addFetchedResultsProcessingBlock(processingBlock:(Void)->Void) {
fetchedResultsProcessingOperations.append(NSBlockOperation(block: processingBlock))
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
@stinger
stinger / RxCollectionViewSectionedAnimatedDataSourceExample.swift
Created March 28, 2017 09:53
RxCollectionViewSectionedAnimatedDataSource example with multiple cells types
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
class ViewController: BaseCollectionViewController {
...
typealias Section = AnimatableSectionModel<String, CellStyle>
#set the shell to /bin/sh
TAGS="TODO:|FIXME:"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
@stinger
stinger / RxSwiftMVVM.swift
Created January 2, 2017 15:07
RxSwift MVVM
import RxSwift
// -- View Model
struct LoginViewModel {
var username = Variable<String>("")
var password = Variable<String>("")
var isValid : Observable<Bool>{
return Observable.combineLatest( self.username, self.password)
@stinger
stinger / RxSwiftMVVMViewSinks.swift
Created January 2, 2017 15:05
RxSwift MVVM view sinks
class MyCustomView : UIView {
var sink : AnyObserver<SomeComplexStructure> {
return AnyObserver { [weak self] event in
switch event {
case .next(let data):
self?.something.text = data.property.text
break
case .error(let error):
self?.backgroundColor = .red