Skip to content

Instantly share code, notes, and snippets.

@andyyhope
Last active November 15, 2020 10:27

Revisions

  1. andyyhope revised this gist Oct 31, 2016. 1 changed file with 3 additions and 1 deletion.
    4 changes: 3 additions & 1 deletion UserDefaultable.swift
    Original file line number Diff line number Diff line change
    @@ -172,6 +172,8 @@ extension URLUserDefaultable where URLDefaultKey.RawValue == String {

    extension UserDefaults {
    struct Account : BoolUserDefaultable {
    private init() { }

    enum BoolDefaultKey : String {
    case isUserLoggedIn
    }
    @@ -184,4 +186,4 @@ UserDefaults.Account.set(true, forKey: .isUserLoggedIn)

    // Get

    let isUserLoggedIn = UserDefaults.Account.bool(forKey: .isUserLoggedIn)
    let isUserLoggedIn = UserDefaults.Account.bool(forKey: .isUserLoggedIn)
  2. andyyhope created this gist Oct 31, 2016.
    187 changes: 187 additions & 0 deletions UserDefaultable.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,187 @@
    //:
    //: UserDefaultable.swift
    //:
    //: Created by Andyy Hope on 18/08/2016.
    //: Twitter: @andyyhope
    //: Medium: Andyy Hope, https://medium.com/@AndyyHope

    import Foundation

    // MARK: - Key Namespaceable

    protocol KeyNamespaceable { }

    extension KeyNamespaceable {
    private static func namespace(_ key: String) -> String {
    return "\(Self.self).\(key)"
    }

    static func namespace<T: RawRepresentable>(_ key: T) -> String where T.RawValue == String {
    return namespace(key.rawValue)
    }
    }


    // MARK: - Bool Defaults

    protocol BoolUserDefaultable : KeyNamespaceable {
    associatedtype BoolDefaultKey : RawRepresentable
    }

    extension BoolUserDefaultable where BoolDefaultKey.RawValue == String {

    // Set

    static func set(_ bool: Bool, forKey key: BoolDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(bool, forKey: key)
    }

    // Get

    static func bool(forKey key: BoolDefaultKey) -> Bool {
    let key = namespace(key)
    return UserDefaults.standard.bool(forKey: key)
    }
    }


    // MARK: - Float Defaults

    protocol FloatUserDefaultable : KeyNamespaceable {
    associatedtype FloatDefaultKey : RawRepresentable
    }

    extension FloatUserDefaultable where FloatDefaultKey.RawValue == String {

    // Set

    static func set(_ float: Float, forKey key: FloatDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(float, forKey: key)
    }

    // Get

    static func float(forKey key: FloatDefaultKey) -> Float {
    let key = namespace(key)
    return UserDefaults.standard.float(forKey: key)
    }
    }


    // MARK: - Integer Defaults

    protocol IntegerUserDefaultable : KeyNamespaceable {
    associatedtype IntegerDefaultKey : RawRepresentable
    }

    extension IntegerUserDefaultable where IntegerDefaultKey.RawValue == String {

    // Set

    static func set(_ integer: Int, forKey key: IntegerDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(integer, forKey: key)
    }

    // Get

    static func integer(forKey key: IntegerDefaultKey) -> Int {
    let key = namespace(key)
    return UserDefaults.standard.integer(forKey: key)
    }
    }


    // MARK: - Object Defaults

    protocol ObjectUserDefaultable : KeyNamespaceable {
    associatedtype ObjectDefaultKey : RawRepresentable
    }

    extension ObjectUserDefaultable where ObjectDefaultKey.RawValue == String {

    // Set

    static func set(_ object: AnyObject, forKey key: ObjectDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(object, forKey: key)
    }

    // Get

    static func object(forKey key: ObjectDefaultKey) -> Any? {
    let key = namespace(key)
    return UserDefaults.standard.object(forKey: key)
    }
    }


    // MARK: - Double Defaults

    protocol DoubleUserDefaultable : KeyNamespaceable {
    associatedtype DoubleDefaultKey : RawRepresentable
    }

    extension DoubleUserDefaultable where DoubleDefaultKey.RawValue == String {

    // Set

    static func set(_ double: Double, forKey key: DoubleDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(double, forKey: key)
    }

    // Get

    static func double(forKey key: DoubleDefaultKey) -> Double {
    let key = namespace(key)
    return UserDefaults.standard.double(forKey: key)
    }
    }


    // MARK: - URL Defaults

    protocol URLUserDefaultable : KeyNamespaceable {
    associatedtype URLDefaultKey : RawRepresentable
    }

    extension URLUserDefaultable where URLDefaultKey.RawValue == String {

    // Set

    static func set(_ url: URL, forKey key: URLDefaultKey) {
    let key = namespace(key)
    UserDefaults.standard.set(url, forKey: key)
    }

    // Get

    static func url(forKey key: URLDefaultKey) -> URL? {
    let key = namespace(key)
    return UserDefaults.standard.url(forKey: key)
    }
    }


    // MARK: - Use

    // Preparation

    extension UserDefaults {
    struct Account : BoolUserDefaultable {
    enum BoolDefaultKey : String {
    case isUserLoggedIn
    }
    }
    }

    // Set

    UserDefaults.Account.set(true, forKey: .isUserLoggedIn)

    // Get

    let isUserLoggedIn = UserDefaults.Account.bool(forKey: .isUserLoggedIn)