Skip to content

Instantly share code, notes, and snippets.

View DanielCardonaRojas's full-sized avatar

Daniel Cardona Rojas DanielCardonaRojas

View GitHub Profile
extension NSMutableAttributedString {
func replacingOccurrences(of item: String, with replacement: NSAttributedString) {
guard let range: Range<String.Index> = self.string.range(of: item) else {
return
}
let nsrange = NSRange(range, in: self.string)
self.replaceCharacters(in: nsrange, with: replacement)
}
}
@DanielCardonaRojas
DanielCardonaRojas / IntersperseElement.swift
Last active September 17, 2021 13:50
Extension for swift arrays to intersperse elements
extension Array {
func interspersing(_ element: Element) -> Array {
var newArray: [Element] = []
for (index, item) in self.enumerated() {
newArray.append(item)
if index < self.count - 1 {
newArray.append(element)
}
}
return newArray
@DanielCardonaRojas
DanielCardonaRojas / UIStackView+Separator.swift
Last active September 15, 2021 21:35
UIStackView+Extensions
extension UIStackView {
func insertSeparator(_ createSeparator: (() -> UIView)) {
let subviews = self.arrangedSubviews
for v in subviews {
self.removeArrangedSubview(v)
}
for v in subviews {
self.addArrangedSubview(v)
@DanielCardonaRojas
DanielCardonaRojas / ProfileInputField.swift
Created September 18, 2018 14:09
An example of a programmatic custom view
//
// ProfileInputField.swift
// CustomViews
//
// Created by Daniel Esteban Cardona Rojas on 9/14/18.
// Copyright © 2018 Daniel Esteban Cardona Rojas. All rights reserved.
//
import UIKit
@DanielCardonaRojas
DanielCardonaRojas / ArrayExtension.swift
Last active March 27, 2021 01:08
More Array Extensions flattened, unwrapped, all and any.
extension Array {
func flattened<T>() -> [T] where Element == [T] {
return self.flatMap({ $0 })
}
func all(_ pred: (Element) -> Bool) -> Bool {
return self.reduce(true, { acc, v in acc && pred(v) })
}
func any(_ pred: (Element) -> Bool) -> Bool {
@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)
extension String {
func isContainedBy(set: CharacterSet) -> Bool {
let letters = self.components(separatedBy: set)
print(letters)
return self.count == letters.count
}
}
@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
}
@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 / 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