Skip to content

Instantly share code, notes, and snippets.

@vhart
vhart / IdentifiableDispatchQueue.swift
Last active December 4, 2017 22:56
IdentifiableDispatchQueue (Swift 3)
class IdentifiableDispatchQueue {
let key = DispatchSpecificKey<UUID>()
let id = UUID()
let queue: DispatchQueue
convenience init(label: String) {
let queue = DispatchQueue(label: label)
self.init(queue: queue)
@vhart
vhart / TEParsingProtocol_Final.swift
Created August 28, 2017 21:25
Full Type Erased Scenario
public enum Result<T, E: Error> {
case success(T)
case failure(E)
}
public enum NetworkError: Error {
case invalidJson
case badRequest
case timeout
}
class BaseJsonDeserializer<T>: JsonDeserializer {
init() {
guard type(of: self) != BaseJsonDeserializer.self
else { fatalError("do not initialize this abstract class directly") }
}
func parse(json: [String : Any]) -> T {
fatalError("Abstract class. Subclass must override")
}
}
class SomeDeserializer<T, D: JsonDeserializer>: JsonDeserializer {
private let deserializer: D
init<D: JsonDeserializer>(deserializer: D) where D.Response == T {
self.deserializer = deserializer
}
func parse(json: [String : Any]) -> T {
return deserializer.parse(json: json)
}
@vhart
vhart / TEParserProtocol3.swift
Last active August 28, 2017 19:08
Without JsonDeserializer as a generic constraint
class SomeDeserializer<T>: JsonDeserializer {
private let deserializer: JsonDeserializer
init<D: JsonDeserializer>(deserializer: D) where D.Response == T {
self.deserializer = deserializer
}
func parse(json: [String : Any]) -> T {
return deserializer.parse(json: json)
}
@vhart
vhart / TEParserProtocol2.swift
Created August 28, 2017 15:03
Show error that results in wrapping abstract protocol with associated type requirements
class DeserializerBox<D: JsonDeserializer> {
let deserializer: D
init(deserializer: D) {
self.deserializer = deserializer
}
}
class Session<P>: NetworkSession {
typealias Payload = P
@vhart
vhart / TEParserProtocol.swift
Last active August 28, 2017 19:08
Type Erasure Protocol
enum Result<T, E: Error> {
case success(T)
case failure(E)
}
enum NetworkError: Error {
case invalidJson
case badRequest
case timeout
}
@vhart
vhart / Swift3BasicLogger.swift
Last active April 17, 2018 19:21
Basic Logger - Swift 3 Version
/*
from console. `po NSHomeDirectory()`
from terminal cd to that path
cd into Documents
LogFile.txt should be there
To see content update live run tail -F LogFile.txt
*/
public class BasicLogger: NSObject {
@vhart
vhart / BasicLogger.swift
Last active October 16, 2017 05:56
Logger
class BasicLogger: NSObject {
private static let queue = dispatch_queue_create("com.vhart.BasicLoggerQueue", DISPATCH_QUEUE_SERIAL)
private static let dateFormatter = NSDateFormatter()
static var filePath: String {
return fileUrl.path!
}
static var fileUrl: NSURL {
@vhart
vhart / StringLayoutHandler.swift
Last active January 10, 2017 18:58
StringLayoutHandler
import UIKit
import Foundation
struct StringLayoutHandler {
enum SerializationTokens: String {
case tab = "T"
case newline = "N"
var token: String { return "#" + rawValue }