GBA002/DeltaFeatures/Protocols/AnyOption.swift
Riley Testut 2ead48ad40 [Features] Supports dynamic @Option values that may change over time
Uses @autoclosure to keep call site the same, but allows a single picker @Option to show different values depending on other factors (e.g. other @Options).
2023-04-28 15:42:11 -05:00

49 lines
1.0 KiB
Swift

//
// AnyOption.swift
// DeltaFeatures
//
// Created by Riley Testut on 4/12/23.
// Copyright © 2023 Riley Testut. All rights reserved.
//
import SwiftUI
public protocol AnyOption<Value>: AnyObject, Identifiable
{
associatedtype Value: OptionValue
associatedtype DetailView: View
var name: LocalizedStringKey? { get }
var description: LocalizedStringKey? { get }
var key: String { get }
var settingsKey: SettingsName { get }
var values: (() -> [Value])? { get }
var detailView: () -> DetailView? { get }
var value: Value { get set }
}
extension AnyOption
{
public var id: String { self.key }
}
// Don't expose `feature` or `key` setters via AnyOption protocol.
internal protocol _AnyOption: AnyOption
{
var key: String { get set }
var feature: (any AnyFeature)? { get set }
var wrappedValue: Value { get set }
}
extension _AnyOption
{
public var value: Value {
get { self.wrappedValue }
set { self.wrappedValue = newValue }
}
}