From f5d66330cc7e3e8911ae3e2dfef942652f3fe3c2 Mon Sep 17 00:00:00 2001 From: Jesse Squires Date: Thu, 11 Jan 2024 12:47:39 -0800 Subject: [PATCH] [5.0.0] release prep --- Foil.podspec | 2 +- README.md | 32 +++++------ docs/Protocols.html | 9 +-- docs/Protocols/UserDefaultsSerializable.html | 17 +++--- docs/Structs.html | 28 +++++----- ...edDefault.html => FoilDefaultStorage.html} | 38 ++++++------- ...l.html => FoilDefaultStorageOptional.html} | 38 ++++++------- docs/index.html | 56 +++++++++++++++---- docs/search.json | 2 +- 9 files changed, 129 insertions(+), 93 deletions(-) rename docs/Structs/{WrappedDefault.html => FoilDefaultStorage.html} (81%) rename docs/Structs/{WrappedDefaultOptional.html => FoilDefaultStorageOptional.html} (79%) diff --git a/Foil.podspec b/Foil.podspec index 9b74eda..928a6ae 100644 --- a/Foil.podspec +++ b/Foil.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Foil' - s.version = '4.0.1' + s.version = '5.0.0' s.license = 'MIT' s.summary = 'A lightweight property wrapper for UserDefaults' diff --git a/README.md b/README.md index 552922d..a2cde81 100644 --- a/README.md +++ b/README.md @@ -19,20 +19,20 @@ Foil, as in "let me quickly and easily **wrap** and **store** this leftover food ## Usage -You can use `@WrappedDefault` for non-optional values and `@WrappedDefaultOptional` for optional ones. +You can use `@FoilDefaultStorage` for non-optional values and `@FoilDefaultStorageOptional` for optional ones. You may wish to store all your user defaults in one place, however, that is not necessary. **Any** property on **any type** can use this wrapper. ```swift final class AppSettings { static let shared = AppSettings() - @WrappedDefault(key: "flagEnabled") + @FoilDefaultStorage(key: "flagEnabled") var flagEnabled = true - @WrappedDefault(key: "totalCount") + @FoilDefaultStorage(key: "totalCount") var totalCount = 0 - @WrappedDefaultOptional(key: "timestamp") + @FoilDefaultStorageOptional(key: "timestamp") var timestamp: Date? } @@ -56,13 +56,13 @@ enum AppSettingsKey: String, CaseIterable { case timestamp } -extension WrappedDefault { +extension FoilDefaultStorage { init(wrappedValue: T, _ key: AppSettingsKey) { self.init(wrappedValue: wrappedValue, key: key.rawValue) } } -extension WrappedDefaultOptional { +extension FoilDefaultStorageOptional { init(_ key: AppSettingsKey) { self.init(key: key.rawValue) } @@ -77,10 +77,10 @@ There are [many ways to observe property changes](https://www.jessesquires.com/b final class AppSettings: NSObject { static let shared = AppSettings() - @WrappedDefaultOptional(key: "userId") + @FoilDefaultStorageOptional(key: "userId") @objc dynamic var userId: String? - @WrappedDefaultOptional(key: "average") + @FoilDefaultStorageOptional(key: "average") var average: Double? } ``` @@ -122,9 +122,9 @@ AppSettings.shared ### Supported types -The following types are supported by default for use with `@WrappedDefault`. +The following types are supported by default for use with `@FoilDefaultStorage`. -> [!IMPORTANT] +> [!IMPORTANT] > Adding support for custom types is possible by conforming to `UserDefaultsSerializable`. However, **this is highly discouraged** as all `plist` types are supported by default. `UserDefaults` is not intended for storing complex data structures and object graphs. You should probably be using a proper database (or serializing to disk via `Codable`) instead. > > While `Foil` supports storing `Codable` types by default, you should **use this sparingly** and _only_ for small objects with few properties. @@ -144,8 +144,8 @@ The following types are supported by default for use with `@WrappedDefault`. - `RawRepresentable` types - `Codable` types -> [!WARNING] -> If you are storing custom `Codable` types and using the default implementation of `UserDefaultsSerializable` provided by `Foil`, then **you must use the optional variant of the property wrapper**, `@WrappedDefaultOptional`. This will allow you to make breaking changes to your `Codable` type (e.g., adding or removing a property). Alternatively, you can provide a custom implementation of `Codable` that supports migration, or provide a custom implementation of `UserDefaultsSerializable` that handles encoding/decoding failures. See the example below. +> [!WARNING] +> If you are storing custom `Codable` types and using the default implementation of `UserDefaultsSerializable` provided by `Foil`, then **you must use the optional variant of the property wrapper**, `@FoilDefaultStorageOptional`. This will allow you to make breaking changes to your `Codable` type (e.g., adding or removing a property). Alternatively, you can provide a custom implementation of `Codable` that supports migration, or provide a custom implementation of `UserDefaultsSerializable` that handles encoding/decoding failures. See the example below. **Codable Example:** ```swift @@ -156,12 +156,12 @@ struct User: Codable, UserDefaultsSerializable { } // Yes, do this -@WrappedDefaultOptional(key: "user") +@FoilDefaultStorageOptional(key: "user") var user: User? // NO, do NOT this // This will crash if you change User by adding/removing properties -@WrappedDefault(key: "user") +@FoilDefaultStorage(key: "user") var user = User() ``` @@ -190,14 +190,14 @@ var user = User() ### [CocoaPods](http://cocoapods.org) ````ruby -pod 'Foil', '~> 4.0.0' +pod 'Foil', '~> 5.0.0' ```` ### [Swift Package Manager](https://swift.org/package-manager/) ```swift dependencies: [ - .package(url: "https://github.com/jessesquires/Foil.git", from: "4.0.0") + .package(url: "https://github.com/jessesquires/Foil.git", from: "5.0.0") ] ``` diff --git a/docs/Protocols.html b/docs/Protocols.html index baf969d..344e6c1 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -17,7 +17,7 @@
-

Foil 4.0.1 Docs (100% documented)

+

Foil 5.0.0 Docs (100% documented)

GitHubView on GitHub

@@ -48,10 +48,10 @@ Structures @@ -98,6 +98,7 @@

Protocols

  • Set
  • Dictionary
  • RawRepresentable types
  • +
  • Codable types
  • See more @@ -118,7 +119,7 @@

    Declaration

    diff --git a/docs/Protocols/UserDefaultsSerializable.html b/docs/Protocols/UserDefaultsSerializable.html index 35d03fe..ded1869 100644 --- a/docs/Protocols/UserDefaultsSerializable.html +++ b/docs/Protocols/UserDefaultsSerializable.html @@ -17,7 +17,7 @@
    -

    Foil 4.0.1 Docs (100% documented)

    +

    Foil 5.0.0 Docs (100% documented)

    GitHubView on GitHub

    @@ -48,10 +48,10 @@ Structures @@ -86,6 +86,7 @@

    UserDefaultsSerializable

  • Set
  • Dictionary
  • RawRepresentable types
  • +
  • Codable types
  • @@ -149,9 +150,9 @@

    Declaration

  • @@ -159,14 +160,14 @@

    Declaration

    -

    Initializes the object using the provided value.

    +

    Initializes the object using the provided value, or returns nil if initialization fails.

    Declaration

    Swift

    -
    init(storedValue: StoredValue)
    +
    init?(storedValue: StoredValue)
    @@ -197,7 +198,7 @@

    Parameters

    diff --git a/docs/Structs.html b/docs/Structs.html index 4d76769..e2eb044 100644 --- a/docs/Structs.html +++ b/docs/Structs.html @@ -17,7 +17,7 @@
  • @@ -70,9 +70,9 @@

    Structures

  • @@ -83,14 +83,14 @@

    Structures

    A property wrapper that uses UserDefaults as a backing store, whose wrappedValue is non-optional and registers a non-optional default value.

    - See more + See more

    Declaration

    Swift

    @propertyWrapper
    -public struct WrappedDefault<T> where T : UserDefaultsSerializable
    +public struct FoilDefaultStorage<T> where T : UserDefaultsSerializable
    @@ -100,9 +100,9 @@

    Declaration

  • @@ -113,14 +113,14 @@

    Declaration

    A property wrapper that uses UserDefaults as a backing store, whose wrappedValue is optional and does not provide default value.

    - See more + See more

    Declaration

    Swift

    @propertyWrapper
    -public struct WrappedDefaultOptional<T> where T : UserDefaultsSerializable
    +public struct FoilDefaultStorageOptional<T> where T : UserDefaultsSerializable
    @@ -132,7 +132,7 @@

    Declaration

    diff --git a/docs/Structs/WrappedDefault.html b/docs/Structs/FoilDefaultStorage.html similarity index 81% rename from docs/Structs/WrappedDefault.html rename to docs/Structs/FoilDefaultStorage.html index 3efcab1..86bfede 100644 --- a/docs/Structs/WrappedDefault.html +++ b/docs/Structs/FoilDefaultStorage.html @@ -1,7 +1,7 @@ - WrappedDefault Structure Reference + FoilDefaultStorage Structure Reference @@ -13,11 +13,11 @@ - - + +
    -

    Foil 4.0.1 Docs (100% documented)

    +

    Foil 5.0.0 Docs (100% documented)

    GitHubView on GitHub

    @@ -30,7 +30,7 @@
  • @@ -60,12 +60,12 @@
    -

    WrappedDefault

    +

    FoilDefaultStorage

    @propertyWrapper
    -public struct WrappedDefault<T> where T : UserDefaultsSerializable
    +public struct FoilDefaultStorage<T> where T : UserDefaultsSerializable
    @@ -79,9 +79,9 @@

    WrappedDefault

  • - + - key + key
    @@ -106,9 +106,9 @@

    Declaration

  • @@ -133,9 +133,9 @@

    Declaration

  • @@ -160,9 +160,9 @@

    Declaration

  • @@ -177,7 +177,7 @@

    Declaration

    Declaration

    Swift

    -
    public init(wrappedValue: T, key keyName: String, userDefaults: UserDefaults = .standard)
    +
    public init(wrappedValue: T, key keyName: String, userDefaults: UserDefaults = .standard)
    @@ -232,7 +232,7 @@

    Parameters

  • diff --git a/docs/Structs/WrappedDefaultOptional.html b/docs/Structs/FoilDefaultStorageOptional.html similarity index 79% rename from docs/Structs/WrappedDefaultOptional.html rename to docs/Structs/FoilDefaultStorageOptional.html index 4e817d3..7eedb17 100644 --- a/docs/Structs/WrappedDefaultOptional.html +++ b/docs/Structs/FoilDefaultStorageOptional.html @@ -1,7 +1,7 @@ - WrappedDefaultOptional Structure Reference + FoilDefaultStorageOptional Structure Reference @@ -13,11 +13,11 @@ - - + +
    -

    Foil 4.0.1 Docs (100% documented)

    +

    Foil 5.0.0 Docs (100% documented)

    GitHubView on GitHub

    @@ -30,7 +30,7 @@
    @@ -48,10 +48,10 @@ Structures @@ -60,12 +60,12 @@
    -

    WrappedDefaultOptional

    +

    FoilDefaultStorageOptional

    @propertyWrapper
    -public struct WrappedDefaultOptional<T> where T : UserDefaultsSerializable
    +public struct FoilDefaultStorageOptional<T> where T : UserDefaultsSerializable
    @@ -79,9 +79,9 @@

    WrappedDefaultOptional

  • - + - key + key
    @@ -106,9 +106,9 @@

    Declaration

  • @@ -133,9 +133,9 @@

    Declaration

  • @@ -160,9 +160,9 @@

    Declaration

  • @@ -177,7 +177,7 @@

    Declaration

    Declaration

    Swift

    -
    public init(key keyName: String, userDefaults: UserDefaults = .standard)
    +
    public init(key keyName: String, userDefaults: UserDefaults = .standard)
    @@ -220,7 +220,7 @@

    Parameters

  • diff --git a/docs/index.html b/docs/index.html index 8521926..04554b6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -16,7 +16,7 @@
    -

    Foil 4.0.1 Docs (100% documented)

    +

    Foil 5.0.0 Docs (100% documented)

    GitHubView on GitHub

    @@ -47,10 +47,10 @@ Structures @@ -80,7 +80,7 @@

    Why the name?

    Usage

    -

    You can use @WrappedDefault for non-optional values and @WrappedDefaultOptional for optional ones. +

    You can use @WrappedDefault for non-optional values and @WrappedDefaultOptional for optional ones. You may wish to store all your user defaults in one place, however, that is not necessary. Any property on any type can use this wrapper.

    final class AppSettings {
         static let shared = AppSettings()
    @@ -144,7 +144,10 @@ 

    Using KVO

    Using Combine

    -

    Note: that average does not need the @objc dynamic annotation, .receiveValue will fire immediately with the current value of average and on every change after.

    +
    +

    [!NOTE] +The average does not need the @objc dynamic annotation, .receiveValue will fire immediately with the current value of average and on every change after.

    +
    AppSettings.shared.$average
         .sink {
             print($0)
    @@ -153,7 +156,10 @@ 

    Using Combine

    Combine Alternative with KVO

    -

    Note: in this case, userId needs the @objc dynamic annotation and AppSettings needs to inherit from NSObject. Then receiveValue will fire only on changes to wrapped object’s value. It will not publish the initial value as in the example above.

    +
    +

    [!NOTE] +In this case, userId needs the @objc dynamic annotation and AppSettings needs to inherit from NSObject. Then receiveValue will fire only on changes to wrapped object’s value. It will not publish the initial value as in the example above.

    +
    AppSettings.shared
         .publisher(for: \.userId, options: [.new])
         .sink {
    @@ -163,9 +169,14 @@ 

    Combine Alternative with K

    Supported types

    -

    The following types are supported by default for use with @WrappedDefault.

    +

    The following types are supported by default for use with @WrappedDefault.

    -

    Adding support for custom types is possible by conforming to UserDefaultsSerializable. However, this is highly discouraged. UserDefaults is not intended for storing complex data structures and object graphs. You should probably be using a proper database (or serializing to disk via Codable) instead.

    +
    +

    [!IMPORTANT] +Adding support for custom types is possible by conforming to UserDefaultsSerializable. However, this is highly discouraged as all plist types are supported by default. UserDefaults is not intended for storing complex data structures and object graphs. You should probably be using a proper database (or serializing to disk via Codable) instead.

    + +

    While Foil supports storing Codable types by default, you should use this sparingly and only for small objects with few properties.

    +
    • Bool
    • @@ -181,7 +192,30 @@

      Supported types

    • Set
    • Dictionary
    • RawRepresentable types
    • +
    • Codable types
    + +
    +

    [!WARNING] +If you are storing custom Codable types and using the default implementation of UserDefaultsSerializable provided by Foil, then you must use the optional variant of the property wrapper, @WrappedDefaultOptional. This will allow you to make breaking changes to your Codable type (e.g., adding or removing a property). Alternatively, you can provide a custom implementation of Codable that supports migration, or provide a custom implementation of UserDefaultsSerializable that handles encoding/decoding failures. See the example below.

    +
    + +

    Codable Example:

    +
    // Note: uses the default implementation of UserDefaultsSerializable
    +struct User: Codable, UserDefaultsSerializable {
    +    let id: UUID
    +    let name: String
    +}
    +
    +// Yes, do this
    +@WrappedDefaultOptional(key: "user")
    +var user: User?
    +
    +// NO, do NOT this
    +// This will crash if you change User by adding/removing properties
    +@WrappedDefault(key: "user")
    +var user = User()
    +

    Additional Resources

      @@ -207,11 +241,11 @@

      Requirements

    Installation

    CocoaPods

    -
    pod 'Foil', '~> 4.0.0'
    +
    pod 'Foil', '~> 5.0.0'
     

    Swift Package Manager

    dependencies: [
    -    .package(url: "https://github.com/jessesquires/Foil.git", from: "4.0.0")
    +    .package(url: "https://github.com/jessesquires/Foil.git", from: "5.0.0")
     ]
     
    @@ -245,7 +279,7 @@

    License

    diff --git a/docs/search.json b/docs/search.json index 5191dee..d84baa1 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Structs/WrappedDefaultOptional.html#/s:4Foil22WrappedDefaultOptionalV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key for the value in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"WrappedDefaultOptional"},"Structs/WrappedDefaultOptional.html#/s:4Foil22WrappedDefaultOptionalV12wrappedValuexSgvp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe value retrieved from \u003ccode\u003eUserDefaults\u003c/code\u003e, if any exists.\u003c/p\u003e","parent_name":"WrappedDefaultOptional"},"Structs/WrappedDefaultOptional.html#/s:4Foil22WrappedDefaultOptionalV14projectedValue7Combine12AnyPublisherVyxSgs5NeverOGvp":{"name":"projectedValue","abstract":"\u003cp\u003eA publisher that delivers updates to subscribers.\u003c/p\u003e","parent_name":"WrappedDefaultOptional"},"Structs/WrappedDefaultOptional.html#/s:4Foil22WrappedDefaultOptionalV3key12userDefaultsACyxGSS_So06NSUserG0Ctcfc":{"name":"init(key:userDefaults:)","abstract":"\u003cp\u003eInitializes the property wrapper.\u003c/p\u003e","parent_name":"WrappedDefaultOptional"},"Structs/WrappedDefault.html#/s:4Foil14WrappedDefaultV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key for the value in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"WrappedDefault"},"Structs/WrappedDefault.html#/s:4Foil14WrappedDefaultV12wrappedValuexvp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe value retrieved from \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"WrappedDefault"},"Structs/WrappedDefault.html#/s:4Foil14WrappedDefaultV14projectedValue7Combine12AnyPublisherVyxs5NeverOGvp":{"name":"projectedValue","abstract":"\u003cp\u003eA publisher that delivers updates to subscribers.\u003c/p\u003e","parent_name":"WrappedDefault"},"Structs/WrappedDefault.html#/s:4Foil14WrappedDefaultV12wrappedValue3key12userDefaultsACyxGx_SSSo06NSUserH0Ctcfc":{"name":"init(wrappedValue:key:userDefaults:)","abstract":"\u003cp\u003eInitializes the property wrapper.\u003c/p\u003e","parent_name":"WrappedDefault"},"Structs/WrappedDefault.html":{"name":"WrappedDefault","abstract":"\u003cp\u003eA property wrapper that uses \u003ccode\u003eUserDefaults\u003c/code\u003e as a backing store,"},"Structs/WrappedDefaultOptional.html":{"name":"WrappedDefaultOptional","abstract":"\u003cp\u003eA property wrapper that uses \u003ccode\u003eUserDefaults\u003c/code\u003e as a backing store,"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11StoredValueQa":{"name":"StoredValue","abstract":"\u003cp\u003eThe type of the value that is stored in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11storedValue06StoredF0Qzvp":{"name":"storedValue","abstract":"\u003cp\u003eThe value to store in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11storedValuex06StoredF0Qz_tcfc":{"name":"init(storedValue:)","abstract":"\u003cp\u003eInitializes the object using the provided value.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html":{"name":"UserDefaultsSerializable","abstract":"\u003cp\u003eDescribes a value that can be saved to and fetched from \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e"},"Protocols.html":{"name":"Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Structs.html":{"name":"Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file +{"Structs/FoilDefaultStorageOptional.html#/s:4Foil0A22DefaultStorageOptionalV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key for the value in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"FoilDefaultStorageOptional"},"Structs/FoilDefaultStorageOptional.html#/s:4Foil0A22DefaultStorageOptionalV12wrappedValuexSgvp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe value retrieved from \u003ccode\u003eUserDefaults\u003c/code\u003e, if any exists.\u003c/p\u003e","parent_name":"FoilDefaultStorageOptional"},"Structs/FoilDefaultStorageOptional.html#/s:4Foil0A22DefaultStorageOptionalV14projectedValue7Combine12AnyPublisherVyxSgs5NeverOGvp":{"name":"projectedValue","abstract":"\u003cp\u003eA publisher that delivers updates to subscribers.\u003c/p\u003e","parent_name":"FoilDefaultStorageOptional"},"Structs/FoilDefaultStorageOptional.html#/s:4Foil0A22DefaultStorageOptionalV3key12userDefaultsACyxGSS_So06NSUserG0Ctcfc":{"name":"init(key:userDefaults:)","abstract":"\u003cp\u003eInitializes the property wrapper.\u003c/p\u003e","parent_name":"FoilDefaultStorageOptional"},"Structs/FoilDefaultStorage.html#/s:4Foil0A14DefaultStorageV3keySSvp":{"name":"key","abstract":"\u003cp\u003eThe key for the value in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"FoilDefaultStorage"},"Structs/FoilDefaultStorage.html#/s:4Foil0A14DefaultStorageV12wrappedValuexvp":{"name":"wrappedValue","abstract":"\u003cp\u003eThe value retrieved from \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"FoilDefaultStorage"},"Structs/FoilDefaultStorage.html#/s:4Foil0A14DefaultStorageV14projectedValue7Combine12AnyPublisherVyxs5NeverOGvp":{"name":"projectedValue","abstract":"\u003cp\u003eA publisher that delivers updates to subscribers.\u003c/p\u003e","parent_name":"FoilDefaultStorage"},"Structs/FoilDefaultStorage.html#/s:4Foil0A14DefaultStorageV12wrappedValue3key12userDefaultsACyxGx_SSSo06NSUserH0Ctcfc":{"name":"init(wrappedValue:key:userDefaults:)","abstract":"\u003cp\u003eInitializes the property wrapper.\u003c/p\u003e","parent_name":"FoilDefaultStorage"},"Structs/FoilDefaultStorage.html":{"name":"FoilDefaultStorage","abstract":"\u003cp\u003eA property wrapper that uses \u003ccode\u003eUserDefaults\u003c/code\u003e as a backing store,"},"Structs/FoilDefaultStorageOptional.html":{"name":"FoilDefaultStorageOptional","abstract":"\u003cp\u003eA property wrapper that uses \u003ccode\u003eUserDefaults\u003c/code\u003e as a backing store,"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11StoredValueQa":{"name":"StoredValue","abstract":"\u003cp\u003eThe type of the value that is stored in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11storedValue06StoredF0Qzvp":{"name":"storedValue","abstract":"\u003cp\u003eThe value to store in \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html#/s:4Foil24UserDefaultsSerializableP11storedValuexSg06StoredF0Qz_tcfc":{"name":"init(storedValue:)","abstract":"\u003cp\u003eInitializes the object using the provided value, or returns \u003ccode\u003enil\u003c/code\u003e if initialization fails.\u003c/p\u003e","parent_name":"UserDefaultsSerializable"},"Protocols/UserDefaultsSerializable.html":{"name":"UserDefaultsSerializable","abstract":"\u003cp\u003eDescribes a value that can be saved to and fetched from \u003ccode\u003eUserDefaults\u003c/code\u003e.\u003c/p\u003e"},"Protocols.html":{"name":"Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Structs.html":{"name":"Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file