LeadKit/TIFoundationUtils
Ivan Smolin 102c15ca07 added StatefulButton & RoundedStatefulButton.
added CACornerMask rounding extension.
added UIControl.State dictionary extensions.
added UIFont registration.
reworked BaseTextAttributes & ViewText.
removed ViewTextConfigurable.
2020-12-23 16:45:36 +03:00
..
Sources/CodableKeyValueStorage add CodableKeyValueStorage with propertyWrapper 2020-08-28 19:18:09 +03:00
README.md add CodableKeyValueStorage with propertyWrapper 2020-08-28 19:18:09 +03:00
TIFoundationUtils.podspec added StatefulButton & RoundedStatefulButton. 2020-12-23 16:45:36 +03:00

README.md

TIFoundationUtils

Set of helpers for Foundation framework classes.

CodableKeyValueStorage

Storage that can get and set codable objects by the key.

Implementations: UserDefaults

Example

struct ProfileInfo: Codable {
    let userName: String
}

Keys:

extension StorageKey {
    static var profileKey: StorageKey<ProfileInfo> {
        .init(rawValue: "profileKey")
    }

    static var onboardingFinishedKey: StorageKey<Bool> {
        .init(rawValue: "onboardingFinishedKey")
    }
}

Subscript example

var defaults = UserDefaults.standard
defaults[.profileKey] = ProfileInfo(userName: "John Appleseed")
defaults[.profileKey] = "Agent Smith" // this will threat compile error:
// Cannot assign value of type 'String' to subscript of type 'ProfileInfo'

@propertyWrapper example

final class ViewModel {
    @UserDefaultsCodableBackingStore(key: .profileKey, codableKeyValueStorage: .standard)
    var profile: ProfileInfo?

    // This will threat compile error:
    // Cannot convert value of type 'BackingStore<UserDefaults, Bool?>' to specified type 'ProfileInfo?'
    @UserDefaultsCodableBackingStore(key: .onboardingFinishedKey, codableKeyValueStorage: .standard)
    var wrongKeyProfile: ProfileInfo?

    // For primitive types we can't use default json decoder/encoder
    @UserDefaultsCodableBackingStore(key: .onboardingFinishedKey,
                                     codableKeyValueStorage: .standard,
                                     decoder: UnarchiverKeyValueDecoder(),
                                     encoder: ArchiverKeyValueEncoder())
    var onboardingFinished = false
}