Skip to content

Instantly share code, notes, and snippets.

View DanielCardonaRojas's full-sized avatar

Daniel Cardona Rojas DanielCardonaRojas

View GitHub Profile
@DanielCardonaRojas
DanielCardonaRojas / BasicSwiftProtocolExtensions.swift
Last active April 3, 2019 14:32
Extensions on Equatable, Comparable, etc..
extension Comparable {
func clamped(min: Self, max: Self) -> Self {
if self < min {
return min
}
if self > max {
return max
}
extension UITextView {
func makeSelfSizing() -> [NSKeyValueObservation] {
self.isScrollEnabled = false
NotificationCenter.default.addObserver(self, selector: #selector(didChangeTextViewContent), name: .UITextViewTextDidChange, object: self)
return [
observe(\UITextView.text, changeHandler: { this, change in
self.didChangeTextViewContent()
}),
observe(\UITextView.attributedText, changeHandler: { this, change in
extension UITextView {
var currentWord: String? {
return currentWordRange.map({ String(text[$0]) })
}
var currentWordRange: Range<String.Index>? {
let regex = try! NSRegularExpression(pattern: "\\S+$")
let textRange = NSRange(location: 0, length: selectedRange.location)
if let range = regex.firstMatch(in: text, range: textRange)?.range {
return Range(range, in: text)
@DanielCardonaRojas
DanielCardonaRojas / TextFormatter.swift
Last active March 8, 2019 14:01
A class simplifies handling NSAttributedString properties.
//
// TextViewFormatter.swift
// TextViewFormatter
//
// Created by Daniel Esteban Cardona Rojas on 3/6/19.
// Copyright © 2019 Daniel Esteban Cardona Rojas. All rights reserved.
//
import UIKit
/*
@DanielCardonaRojas
DanielCardonaRojas / UserDefaultsExtension.swift
Created January 28, 2019 22:12
Serialize/deserialize any Codable type to/from UserDefaults
extension UserDefaults {
@discardableResult
func serialize<V: Codable>(_ value: V, forKey key: String) -> Bool {
if let data = value.asPlistData {
self.set(data, forKey: key)
return self.synchronize()
}
return false
@DanielCardonaRojas
DanielCardonaRojas / APIClient+PromiseKit.swift
Last active April 30, 2020 23:32
Custom API Client Abstractions inspired by http://kean.github.io/post/api-client but with no third party dependencies. As a lib over here -> https://github.com/DanielCardonaRojas/APIClient
import PromiseKit
extension APIClient {
func request<Response, T>(_ requestConvertible: T,
additionalHeaders headers: [String: String]? = nil,
additionalQuery queryParameters: [String: String]? = nil,
baseUrl: URL? = nil) -> Promise<T.Result>
where T: URLResponseCapable, T: URLRequestConvertible, T.Result == Response {
return Promise { seal in
self.request(requestConvertible, additionalHeaders: headers, additionalQuery: queryParameters, success: { response in
@DanielCardonaRojas
DanielCardonaRojas / MiscExtensions.swift
Created November 8, 2018 14:16
Random Swift Extensions (TODO: Order as this gist grows)
extension UIEdgeInsets {
static func with(_ constant: CGFloat) -> UIEdgeInsets {
return UIEdgeInsets(top: constant, left: constant, bottom: constant, right: constant)
}
}
extension Comparable {
func clamp(min: Self, max: Self) -> Self {
if self < min {
return min
@DanielCardonaRojas
DanielCardonaRojas / UIScrollViewExtensions.swift
Created October 24, 2018 14:29
UIScrollView Extensions (scroll to subview and get relative offset of subview)
extension UIScrollView {
func scrollSubViewToTop(_ subview: UIView, offset: CGFloat, animated: Bool) {
let point = convert(subview.frame.origin, from: subview.superview ?? subview)
setContentOffset(CGPoint(x: 0, y: point.y - offset), animated: animated)
}
func viewPortOffset(of subview: UIView) -> CGFloat {
let point = convert(subview.frame.origin, from: subview.superview ?? subview)
return point.y - contentOffset.y
}
extension String {
func isContainedBy(set: CharacterSet) -> Bool {
let letters = self.components(separatedBy: set)
print(letters)
return self.count == letters.count
}
}
@DanielCardonaRojas
DanielCardonaRojas / StringExtensions.swift
Last active August 30, 2019 14:54
StringExtensions
extension String {
func isContainedBy(set: CharacterSet) -> Bool {
let letters = self.components(separatedBy: set)
print(letters)
return self.count == letters.count
}
func filtered(by set: CharacterSet) -> String {
let chars = self.unicodeScalars.filter({ set.contains($0)})
let unicode = UnicodeScalarView(chars)