UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Day 52 - Cupcake challenge ( Display from structure )

Forums > 100 Days of SwiftUI

Hello everyone!

So I've created a new structure called OrderModel

struct OrderModel: Codable {
    var type: Int
    var quantity: Int

    var extraFrosting = false
    var addSprinkles = false

    var name: String
    var streetAddress: String
    var city: String
    var zip: String

    var specialRequestEnabled = false {  ...  } 
    var cost:  Double { ... }

    static let types = ["Vanilla", "Strawberry", "Chocolate", "Rainbow"]
}

This is what my class looks like:

class OrderViewModel: ObservableObject, Codable {

    @Published var order = OrderModel() // Missing argument for parameter 'from' in call 

    enum CodingKeys: CodingKey {
        case order
    }

    func encode(to encoder: Encoder) throws {
        var containter = encoder.container(keyedBy: CodingKeys.self)
        try containter.encode(order, forKey: .order)

    }

    required init(from decoder: Decoder) throws {
        let containter = try decoder.container(keyedBy: CodingKeys.self)
        order = try containter.decode(order.self, forKey: .order)

    }

    init() {}
}

I do not really know how to display this data now..

struct CupCake: View {
    @StateObject var vm = OrderViewModel()

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Select your cake type", selection: $vm.order.type ) {
                        ForEach(OrderModel.type.indices) {
                            Text(OrderViewModel.types[$0])
                        }
                    }

                    Stepper("Number of cakes: \(order.quantity)", value: $order.quantity, in: 3...20)
                }

I have tried with :

Picker("Select your cake type", selection: $vm.order.type ) { ... }
Picker("Select your cake type", selection: $OrdelModel.type ) { ... } 

2      

@TooMaa is scratching his head....

I do not really know how to display this data now.

I like to think of ForEach as a view factory!
See -> View Factory
or See -> View Factory
or See -> View Factory

So, ask yourself: What is my ForEach view factory trying to make?

ForEach(OrderModel.type.indices) {
    Text(OrderViewModel.types[$0])  // <-- What is the ForEach view factory trying to make?
}

Answer: Your view factory is trying to make a Text view for each type in your OrderModel.

WAIT WHUT???!?!?

Each type in your what?

Please examine your OrderModel closely. Have you defined "type" in your OrderModel?

Also note: type is probably a very bad name to use because of its definition within the Swift language. Instead, be more verbose to capture the nature of this variable. Perhaps cupcakeType might be a better (less confusing?) name!

Keep coding. Please let us know how you solved this.

2      

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

Sponsor Hacking with Swift and reach the world's largest Swift community!

Archived topic

This topic has been closed due to inactivity, so you can't reply. Please create a new topic if you need to.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.