Skip to content

Instantly share code, notes, and snippets.

View marty-suzuki's full-sized avatar
Back to the future

Taiki Suzuki marty-suzuki

Back to the future
View GitHub Profile
@marty-suzuki
marty-suzuki / UnidirectionalInputOutputViewModelWithKeyPath.swift
Last active March 28, 2019 09:43
Logic of Unidirectional Input / Output ViewModel Sample with Swift KeyPath (Sample logic of https://github.com/cats-oss/Unio)
// This sample works on Swift4.2 and Swift5!
// Let's try to execute this sample with Playground!
import Foundation
// - MARK: Artificially RxSwift classes
public enum Rx {
public final class Observable<E> {}
@testable import 'Your Target Name'
import UIKit
import Foundation
/// Define this protocol in your target
// protocol AutoPrivatePropertyAccessible {}
// MARK: - PrivatePropertyAccessible
protocol PrivatePropertyAccessible {
associatedtype PrivatePropertiesCompatible
@testable import 'Your Target Name'
import UIKit
import Foundation
/// Define this protocol in your target
// protocol AutoPrivatePropertyAccessible {}
// MARK: - PrivatePropertyAccessible
protocol PrivatePropertyAccessible {
associatedtype PrivatePropertiesCompatible
import Foundation
let buildLog = """
"""
let regex = try! NSRegularExpression(pattern: "(\\d*.\\d*)ms.*/(.*\\.swift)*", options: [])
let range = NSRange(location: 0, length: (buildLog as NSString).length)
let results = regex.matches(in: buildLog, options: [], range: range)
// A swift implementation of [this presentetion](https://www.slideshare.net/AkinoriAbe1/aja-2016623).
protocol Trait {}
enum Z: Trait {}
enum S<N: Trait>: Trait {}
struct Nat<N: Trait>: CustomStringConvertible {
let n: Int
fileprivate init(n: Int) {
//: Playground - noun: a place where people can play
import Foundation
// MARK: - Pub / Sub
protocol Subscription {
var id: SubscriptionID { get }
}
extension NSObject {
func remove(observer: NSObject, for keyPath: String) throws {
var error: NSError? = nil
removeObserver(observer, forKeyPath: keyPath, error: &error)
guard let e = error else { return }
throw e
}
}
@implementation NSObject (Error)
- (void)removeObserver:(NSObject * _Nonnull)observer forKeyPath:(NSString * _Nonnull)keyPath error:(NSError * _Nullable __autoreleasing * _Nullable)error {
@try {
[self removeObserver:observer forKeyPath:keyPath];
} @catch (NSException *exception) {
NSMutableDictionary *userInfo = nil;
if (exception.userInfo == nil) {
userInfo = [NSMutableDictionary dictionaryWithCapacity:0];
} else {
extension Array {
func unique(predicate: (Element, Element) -> Bool) -> [Element] {
var result: [Element] = []
forEach { e -> Void in
guard !result.contains({ r -> Bool in
return predicate(r, e)
}) else { return }
result.append(e)
}
return result
@interface TriangleView()
@property (nonatomic, strong, readonly) CAShapeLayer *shapeLayer;
@end
@implementation TriangleView
static NSString *const kAniamtionKey = @"path";
static CGFloat const ANIMATION_DURATION = 0.25f;
- (id)initWithFrame:(CGRect)frame {