Skip to content

Instantly share code, notes, and snippets.

@mhuusko5
mhuusko5 / Swift – func asArray<T>
Created October 19, 2015 12:23
Swift – func asArray<T>(any: Any, type: T.Type = T.self) -> [T]?
func asArray<T>(any: Any, type: T.Type = T.self) -> [T]? {
let mirror = Mirror(reflecting: any)
let properties = Array(mirror.children)
guard let displayStyle = mirror.displayStyle where (displayStyle == .Collection || displayStyle == .Set || displayStyle == .Tuple) else {
return nil
}
var array = [T]()
@mhuusko5
mhuusko5 / NSArray – makeObjectsPerformSelector:withEnumerableArguments:
Last active October 19, 2015 12:24
NSArray – makeObjectsPerformSelector:withEnumerableArguments:
@implementation NSArray ()
- (void)makeObjectsPerformSelector:(SEL)selector withEnumerableArguments:(id<NSFastEnumeration>)arguments {
for (id object in self) {
if (object && [object respondsToSelector:selector]) {
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object methodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:object];
if (arguments) {
@mhuusko5
mhuusko5 / Swift – func asDictionary<K, V>
Created October 19, 2015 12:25
Swift – func asDictionary<K, V>(any: Any, type: (key: K.Type, value: V.Type) = (K.self, V.self)) -> [K: V]?
func asDictionary<K, V>(any: Any, type: (key: K.Type, value: V.Type) = (K.self, V.self)) -> [K: V]? {
let mirror = Mirror(reflecting: any)
let properties = mirror.children
guard let displayStyle = mirror.displayStyle where displayStyle == .Dictionary else {
return nil
}
var dictionary = [K: V]()
@mhuusko5
mhuusko5 / Swift – func deepUnwrap
Created October 19, 2015 12:26
Swift – func deepUnwrap(any: Any) -> Any?
func deepUnwrap(any: Any) -> Any? {
let mirror = Mirror(reflecting: any)
if mirror.displayStyle != .Optional {
return any
}
if let child = mirror.children.first where child.label == "Some" {
return deepUnwrap(child.value)
}
@mhuusko5
mhuusko5 / Swift – func ensureType<T>
Created October 19, 2015 12:30
Swift – func ensureType<T>(type type: T.Type = T.self, transform: (Any) -> T)(_ any: Any) -> T
func ensureType<T>(type type: T.Type = T.self, transform: (Any) -> T)(_ any: Any) -> T {
return ensureType(any, type: type, transform: transform)
}
func ensureType<T>(any: Any, type: T.Type = T.self, transform: (Any) -> T) -> T {
if let any = any as? T {
return any
} else {
return transform(any)
}
@mhuusko5
mhuusko5 / Swift – func associatedValueForEnum
Last active November 12, 2015 18:34
Swift – func associatedValueForEnum(enumm: Any, atIndex index: Int) -> Any?
func caseLabelForEnum(enumm: Any) -> String {
let mirror = Mirror(reflecting: enumm)
return mirror.children.first?.label ?? String(enumm)
}
func associatedValueForEnum(enumm: Any) -> Any? {
let mirror = Mirror(reflecting: enumm)
return mirror.children.first?.value
@mhuusko5
mhuusko5 / iflet.m
Created November 12, 2015 18:37 — forked from CraigSiemens/iflet.m
if-let and guard macros for Objective C
#import <Foundation/Foundation.h>
// VARIABLE must be a variable declaration (NSString *foo)
// VALUE is what you are checking is not nil
// WHERE is an additional BOOL condition
#define iflet(VARIABLE, VALUE) \
ifletwhere(VARIABLE, VALUE, YES)
#define ifletwhere(VARIABLE, VALUE, WHERE) \
@mhuusko5
mhuusko5 / KVODeadlock.m
Created December 6, 2016 15:07
KVO deadlock (seemingly internal global mutex being held, and attempting to swap with lock of object being observed or mutated)
@interface NSObject ()
- (void)_addObserver:(id)arg1 forProperty:(id)arg2 options:(unsigned int)arg3 context:(void*)arg4;
- (void)_changeValueForKey:(id)arg1 key:(id)arg2 key:(id)arg3 usingBlock:(id /* block */)arg4;
- (void)_changeValueForKey:(id)arg1 usingBlock:(id /* block */)arg2;
- (void)_changeValueForKeys:(id*)arg1 count:(unsigned int)arg2 maybeOldValuesDict:(id)arg3 usingBlock:(id /* block */)arg4;
- (void)_didChangeValuesForKeys:(id)arg1;
- (void)_notifyObserversForKeyPath:(id)arg1 change:(id)arg2;
- (void)_notifyObserversOfChangeFromValuesForKeys:(id)arg1 toValuesForKeys:(id)arg2;
- (void)_willChangeValuesForKeys:(id)arg1;
@end
@mhuusko5
mhuusko5 / toRACSignal.swift
Created November 17, 2015 12:56
toRACSignal() for SignalProducer of any type, for Obj-C shimming a project with a Swift ReactiveCocoa based API
public extension SignalProducerType {
func toRACSignal() -> RACSignal {
let signal = RACSignal.createSignal { subscriber in
let disposable = self.start {
switch $0 {
case let .Next(value):
guard let value = deepUnwrap(value) else {
subscriber.sendNext(nil)
break
}
@mhuusko5
mhuusko5 / KVOCrash.m
Created December 5, 2016 19:33
KVO with multi-key path where observer is added/removed while non-last-key property is mutated, crashes
/* 2016-12-05 19:29:16.988026 Compass[71668:644974] [General] An uncaught exception was raised
2016-12-05 19:29:16.988060 Compass[71668:644974] [General] Cannot update for observer <TestObserver 0x600000001060> for the key path "nestedObject.nestedField" from <TestObject 0x600000026ee0>, most likely because the value for the key "nestedObject" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the TestObject class.
2016-12-05 19:29:16.988395 Compass[71668:644974] [General] (
0 CoreFoundation 0x00007fffaa71ee7b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fffbf303cad objc_exception_throw + 48
2 CoreFoundation 0x00007fffaa79d99d +[NSException raise:format:] + 205
3 Foundation 0x00007fffac0f5a62 -[NSKeyValueNestedProperty object:withObservance:didChangeValueForKeyOrKeys:recurse:forwardingValues:] + 830
4 Foundation 0x00007fffac0c8e88 NSKe