Last active
May 24, 2024 23:52
-
-
Save magnuskahr/b534d803a550cbe5dc6b65f573d5af2f to your computer and use it in GitHub Desktop.
A simple picker to pick a enum.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import SwiftUI | |
struct EnumPicker<T: Hashable & CaseIterable, V: View>: View { | |
@Binding var selected: T | |
var title: String? = nil | |
let mapping: (T) -> V | |
var body: some View { | |
Picker(selection: $selected, label: Text(title ?? "")) { | |
ForEach(Array(T.allCases), id: \.self) { | |
mapping($0).tag($0) | |
} | |
} | |
} | |
} | |
extension EnumPicker where T: RawRepresentable, T.RawValue == String, V == Text { | |
init(selected: Binding<T>, title: String? = nil) { | |
self.init(selected: selected, title: title) { | |
Text($0.rawValue) | |
} | |
} | |
} |
Hey @apocolipse!
That is also a take on using enum for pickers. If a simple text view is what always is needed, I think it is a great solution, however it misses the view flexibility of my version :-)
Also, the best of both world can be done! See this extension for my version:
extension EnumPicker where V == Text {
init(selected: Binding<T>, title: String? = nil, display: @escaping (T) -> String) {
self.init(selected: selected, title: title) {
Text(display($0))
}
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Instead of extensions, you can use a simplified version with a default "displayer", note no need for
RawRepresentable
, justHashable
andCaseIterable
You can pass closures to
display
, or KeyPath's with Swift 5.2+, which allows the following, which IMO is better as it simplifies the generic definition greatly and moves the burden on "how to display stuff" to the caller, but in a pretty easy to manage manner