diff --git a/DeltaFeatures/Option.swift b/DeltaFeatures/Option.swift index 7723bf1..f534439 100644 --- a/DeltaFeatures/Option.swift +++ b/DeltaFeatures/Option.swift @@ -16,7 +16,7 @@ public class Option: _AnyOption public let name: LocalizedStringKey? public let description: LocalizedStringKey? - public let values: [Value]? + public let values: (() -> [Value])? public private(set) var detailView: () -> DetailView? = { nil } // Assigned to property name. @@ -76,20 +76,28 @@ public class Option: _AnyOption } } - private init(defaultValue: Value, name: LocalizedStringKey?, description: LocalizedStringKey?, values: (some Collection)?) + private init(defaultValue: Value, name: LocalizedStringKey?, description: LocalizedStringKey?, values: (() -> some Collection)?) { self.defaultValue = defaultValue self.name = name self.description = description - self.values = values.map { Array($0) } + + if let values + { + self.values = { Array(values()) } + } + else + { + self.values = nil + } self.detailView = { nil } } private convenience init(defaultValue: Value, name: LocalizedStringKey?, description: LocalizedStringKey?) { - self.init(defaultValue: defaultValue, name: name, description: description, values: [Value]?.none) + self.init(defaultValue: defaultValue, name: name, description: description, values: (() -> [Value])?.none) } } @@ -134,35 +142,35 @@ public extension Option where Value == Bool, DetailView == OptionToggleView public extension Option where Value: LocalizedOptionValue, DetailView == OptionPickerView { // Non-Optional - convenience init(wrappedValue: Value, name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: some Collection) + convenience init(wrappedValue: Value, name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: @autoclosure @escaping () -> some Collection) { self.init(defaultValue: wrappedValue, name: name, description: description, values: values) self.detailView = { [weak self] () -> DetailView? in guard let self else { return nil } - return OptionPickerView(name: name, options: Array(values), selectedValue: self.valueBinding) + return OptionPickerView(name: name, options: Array(values()), selectedValue: self.valueBinding) } } // Optional, default = nil - convenience init(name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: some Collection) where Value: OptionalProtocol, Value.Wrapped: LocalizedOptionValue + convenience init(name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: @autoclosure @escaping () -> some Collection) where Value: OptionalProtocol, Value.Wrapped: LocalizedOptionValue { self.init(defaultValue: Value.none, name: name, description: description, values: values) self.detailView = { [weak self] () -> DetailView? in guard let self else { return nil } - return OptionPickerView(name: name, options: values.appendingNil(), selectedValue: self.valueBinding) + return OptionPickerView(name: name, options: values().appendingNil(), selectedValue: self.valueBinding) } } // Optional, default = non-nil - convenience init(wrappedValue: Value, name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: some Collection) where Value: OptionalProtocol, Value.Wrapped: LocalizedOptionValue + convenience init(wrappedValue: Value, name: LocalizedStringKey, description: LocalizedStringKey? = nil, values: @autoclosure @escaping () -> some Collection) where Value: OptionalProtocol, Value.Wrapped: LocalizedOptionValue { self.init(defaultValue: wrappedValue, name: name, description: description, values: values) self.detailView = { [weak self] () -> DetailView? in guard let self else { return nil } - return OptionPickerView(name: name, options: values.appendingNil(), selectedValue: self.valueBinding) + return OptionPickerView(name: name, options: values().appendingNil(), selectedValue: self.valueBinding) } } } diff --git a/DeltaFeatures/Protocols/AnyOption.swift b/DeltaFeatures/Protocols/AnyOption.swift index d15cda4..cf18ed7 100644 --- a/DeltaFeatures/Protocols/AnyOption.swift +++ b/DeltaFeatures/Protocols/AnyOption.swift @@ -19,7 +19,7 @@ public protocol AnyOption: AnyObject, Identifiable var key: String { get } var settingsKey: SettingsName { get } - var values: [Value]? { get } + var values: (() -> [Value])? { get } var detailView: () -> DetailView? { get } var value: Value { get set }