Skip to content

Instantly share code, notes, and snippets.

View nathantannar4's full-sized avatar

Nathan Tannar nathantannar4

View GitHub Profile
@nathantannar4
nathantannar4 / install.sh
Created August 10, 2018 20:44
My install script for new GCP instances to install all the necessities.
#!/bin/bash
# Prefer IPv4 over IPv6 - make apt-get faster
sudo sed -i "s/#precedence ::ffff:0:0\/96 100/precedence ::ffff:0:0\/96 100/" /etc/gai.conf
# Update Packages
sudo apt-get update -y
sudo apt-get upgrade -y
# Nano Editor
@nathantannar4
nathantannar4 / XCodeTemplateGenerator.swift
Created September 30, 2018 22:04
Autogenerate an Xcode TemplateInfo.plist file based on current project
/*
XCodeTemplateGenerator.swift
Created by Nathan Tannar
Usage:
Run `swift XCodeTemplateGenerator.swift $SOURCE_FOLDER` where SOURCE_FOLDER is the root directory of your
XCode projects source code. A TemplateInfo.plist will be generated in the SOURCE_FOLDER allowing you
to copy the folder to your XCodes project template folder.
*/
@nathantannar4
nathantannar4 / Reflectable.swift
Created December 17, 2018 22:17
Generate JSON representation of values using the Mirror API
//
// Reflectable.swift
//
// Created by Nathan Tannar on 2018-12-04.
//
import Foundation
// Add this protocol to your `struct` or `class`
protocol Reflectable {
@nathantannar4
nathantannar4 / Switch.swift
Created December 20, 2018 23:57
Re-Engineering UISwitch
//
// Switch.swift
// Re-Engineering UISwitch
//
// Created by Nathan Tannar on 15/12/18.
// Copyright © 2018 Nathan Tannar. All rights reserved.
//
import UIKit
@nathantannar4
nathantannar4 / Switch.swift
Created December 21, 2018 00:43
Re-Engineering Switch Outline
class Switch: UIControl {
var isOn: Bool
// Determines if the thumbLayer stretches on touchDown
var isStretchEnable: Bool
// Border of the trackLayer, this also determines the inset of the innerLayer
var borderWidth: CGFloat
import UIKit
class ViewModelController<ViewModelType: IViewModel>: UIViewController {
let viewModel: ViewModelType
required init(viewModel: ViewModelType) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
import UIKit
protocol IReusableView: AnyObject where Self: UIView {
func prepareForReuse()
}
class TableViewCell<ViewType: IReusableView>: UITableViewCell {
let wrappedView = ViewType()
import UIKit
class RowView<LeftViewType: UIView, RightViewType: UIView, AccessoryViewType: UIView>: View {
let leftView = LeftViewType()
let rightView = RightViewType()
let accessoryView = AccessoryViewType()
override func viewDidLoad() {
super.viewDidLoad()
import UIKit
class TextFieldCell: RowView<UILabel, TextField, UIView> {
var label: UILabel { return leftView }
var textField: TextField { return rightView }
}
class TextViewCell: RowView<UILabel, InputTextView, UIView> {
var label: UILabel { return leftView }
var textView: InputTextView { return rightView }
import UIKit
class Controller<RootViewType: IView>: UIViewController {
var rootView: RootViewType! {
return view as? RootViewType
}
// MARK: - View Life Cycle