Skip to content

Instantly share code, notes, and snippets.

View zmcartor's full-sized avatar

Zach zmcartor

View GitHub Profile
@zmcartor
zmcartor / mvvmc.swift
Created August 19, 2021 03:16
MVVM+Coordinator Architecture
import UIKit
struct FrontScreenViewmodel {
var hello = "there"
}
// Builds the ViewControllers, and injects the ViewModels
class Factory {
let viewModelFactory = ViewModelFactory()
@zmcartor
zmcartor / OSLog+Extensions.swift
Created March 18, 2019 18:13
OSLog extension for os_signpost usage
/* Usage
let log = OSLog(subsystem: "deep-secrets", category: "cookie-recipes")
let signpostID = log.beginSignpost(withName: "signpost name")
... Do work ...
log.endSignpost(withName: "signpost name" , signpostId: signpostId)
Signposts can also be started w objects instead of SignpostIDs when scope is an issue
@zmcartor
zmcartor / UIImageView+loadFromURL-extension.swift
Last active November 12, 2018 23:09
UIImageView load from URL, placeholder and cache
extension UIImageView {
func setImage(from url: URL, withPlaceholder placeholder: UIImage? = .none, withCache cache:NSCache<NSURL,UIImage>? = .none) -> URLSessionDataTask? {
if let cached = cache?.object(forKey: url as NSURL) {
self.image = cached
return .none
}
self.image = placeholder
let task = URLSession.shared.dataTask(with: url) { (data, _, _) in
@zmcartor
zmcartor / GenericStack.swift
Created October 30, 2018 03:27
Swift Network Stack
enum Result<T> {
case success(T)
case error(Error)
}
struct ToDo : Codable {
var id: Int
var userId: Int
var title:String
var completed:Bool
@zmcartor
zmcartor / dynamic-programming.swift
Created May 25, 2018 16:11
Dynamic Programming with field of spikes in Swift
let field = [0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1]
var memo:[Int:[Int:Bool]] = [0:[:]]
func bounce(startingSpeed:Int, startingIndex:Int, field:[Int]) -> Bool {
// Many base cases. We must still be on the runway.
// We must land on a place with 0 (no spikes)
// Use a double dictionary as the memo. Store true/false. 1 dimension for each changing intput!!!!
@zmcartor
zmcartor / class-method.m
Created April 17, 2018 15:27
Dynamic Class Method ObjC
+ (BOOL)resolveClassMethod:(SEL)name {
NSString *classname = NSStringFromClass([self class]);
NSString *selectorString = [NSString stringWithFormat:@"crazyClass%@",classname];
NSLog(@"string is %@", selectorString);
SEL ourSelector = NSSelectorFromString(selectorString);
if (name == ourSelector) {
// adding class method to meta-class
Class ourClass = object_getClass(NSClassFromString(classname));
class_addMethod(ourClass, ourSelector, (IMP)crazyClassMethod, "@v:@");
@zmcartor
zmcartor / dynamic-instance-method.m
Created April 17, 2018 15:25
Dynamic Instance Method ObjC
+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
NSString *classname = NSStringFromClass([self class]);
NSString *selectorString = [NSString stringWithFormat:@"insaneInstance%@",classname];
SEL ourSelector = NSSelectorFromString(selectorString);
if (aSEL == ourSelector) {
class_addMethod([self class], aSEL, (IMP)insaneInstanceMethod, "v@:");
return YES;
}
return [super resolveInstanceMethod:aSEL];
}
@zmcartor
zmcartor / unwrap.swift
Last active March 23, 2017 19:05
Unwrap from JSON dict with default value
func unwrap<T:Any>(dictionary:[String : AnyObject], key:String, defaultValue:T) -> T {
let value = dictionary[key] as? T ?? defaultValue
return value as T
}
// Can be curried inside a init?(json:NSDictionary) function
let stringAtKey:(String) -> String = { key in
return unwrap(dictionary , key:key, defaultValue:"")
hello() { name in
... some code ...
anotherMethod { anotherThing in
.. I'm nested in two closures
}
}
@zmcartor
zmcartor / robotRumble.swift
Last active July 13, 2016 01:22
Robot Rumble Noise Generator
import XCPlayground
import AudioKit
let osc = AKWhiteNoise()
let filter = AKLowPassFilter(osc, cutoffFrequency: 200, resonance: 3)
osc.start()
let verb = AKReverb(filter)
verb.dryWetMix = 0.5