I am trying to create a entry field view that will accept any enum for a Picker (as long as that enum conforms to CaseIterable and String.
struct EntryFieldView<T: CaseIterable>: View where T.AllCases: RandomAccessCollection, T.AllCases.Element: Hashable & RawRepresentable, T.AllCases.Element.RawValue == String {
@State var fieldTitle: String = ""
@State var dropDownSelection: T
@Binding var entry: String
var body: some View {
VStack(spacing: 0) {
Group {
if self.fieldTitle.isEmpty == false {
HStack {
Text(self.fieldTitle)
.font(.system(size: 10))
Spacer()
}
}
ZStack {
Rectangle()
.frame(height: 40)
.foregroundColor(.white)
.shadow(radius: 2)
HStack {
Picker("Test", selection: self.$entry) {
ForEach(self.dropDownSelection.allCases, id: \.self) { selection in
Text(selection.rawValue)
}
}
}
.padding([.leading, .trailing], 5)
}
}
.padding(.bottom, 10)
}
}
}
And for example I have a simple list of countries:
enum Countries: String, CaseIterable {
case UK = "United Kingdom"
case USA = "United States of America"
case ES = "Spain"
case PL = "Poland"
case DE = "Germany"
}
I get the error Static member 'allCases' cannot be used on instance of type 'T'
with the suggestion
Static member 'allCases' cannot be used on instance of type 'T'
If dropDownSelection is of Type T and T conforms to CaseIterable, why can't I use dropDownSelection.allCases, and why would it suggest I replace dropDownSelection with instance T?
Thanks
allCases is a static member on the type T. dropDownSelection is a single case of that enum.
For example, let's remove the generic T and just your your example Countries. You could say Countries.allCases (note that Countries is a Type), but you would not do:
let country: Countries = .USA
let all = country.allCases // Error
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With