Skip to content

Instantly share code, notes, and snippets.

@DarrenHurst
Created February 5, 2023 20:31
Show Gist options
  • Select an option

  • Save DarrenHurst/52e10d91556d4df697a651ee0a9ea5b3 to your computer and use it in GitHub Desktop.

Select an option

Save DarrenHurst/52e10d91556d4df697a651ee0a9ea5b3 to your computer and use it in GitHub Desktop.
SwiftUI Burger Builder Sample - patterns
//
// CartView.swift
// RTSPStreamer
//
// Created by Darren Hurst on 2023-02-05.
//
import Foundation
import SwiftUI
struct CartView: View {
let burgers: [BurgerBuilder] = [HamburgerBuilder(), CheeseburgerBuilder(), BaconburgerBuilder()]
@State var burger: Burger = Burger(burger: BaconburgerBuilder())
var body: some View {
// returns View Type
LazyVStack {
AnyView( self.showBurgerOptions() )
AnyView( burger.showBurgerView() )
}.onAppear() {
burger.tomatoes = false
}.standard().frame(alignment:.top)
}
/* Binding func */
func showBurgerOptions() -> any View {
@State var scale = 0.5
return VStack {
Text("Burger Type: \($burger.name.wrappedValue)")
ZStack {
Image("BunTop")
}.zIndex(2).offset(y:30)
ZStack {
Image("Tomatoe").zIndex(5).offset(y:-40).opacity(burger.tomatoes ? 0.9: 0)
.animation(.easeOut(duration: 1), value: scale)
Image("bacon").zIndex(4).offset(y:-35)
Image("cheese").zIndex(3).offset(y:-25)
Image("patties").zIndex(1).offset(y:-15)
Image("BunBottom")
}
Toggle("Totamtoes: ", isOn: $burger.tomatoes)
Toggle("Onions: ", isOn: $burger.onions)
Toggle("Lettuce: ", isOn: $burger.lettuce)
Toggle("Ketchup: ", isOn: $burger.ketchup)
}
}
}
struct PreviewBurger : PreviewProvider {
let myBurger: Burger = Burger(burger: BaconburgerBuilder())
static var previews: some View {
CartView()
}
}
protocol BurgerBuilder {
var name: String { get set}
var lettuce: Bool{ get set }
var tomatoes: Bool { get set }
var onions: Bool { get set }
var patties : Int { get set }
var ketchup : Bool { get set }
var mustard : Bool { get set }
var bacon: Bool { get set }
var cheese: Bool { get set }
}
struct Burger: BurgerBuilder {
var name: String
var lettuce: Bool
var tomatoes: Bool
var onions: Bool
var patties: Int
var ketchup: Bool
var mustard: Bool
var bacon: Bool
var cheese: Bool
init(burger: BurgerBuilder) {
self.name = burger.name
self.lettuce = burger.lettuce
self.tomatoes = burger.tomatoes
self.onions = burger.onions
self.patties = burger.patties
self.ketchup = burger.ketchup
self.mustard = burger.mustard
self.bacon = burger.bacon
self.cheese = burger.cheese
}
func showBurgerView() -> any View {
return
VStack {
Text("\(name)")
Text("Tomatoes: \(String(tomatoes))")
Text("Onions: \(String(onions))")
Text("Lettuce: \(String(lettuce))")
Text("Ketchup: \(String(ketchup))")
}
}
}
struct HamburgerBuilder: BurgerBuilder {
var name: String = "Basic Burger"
var lettuce: Bool = true
var tomatoes: Bool = true
var onions: Bool = true
var patties: Int = 1
var ketchup: Bool = true
var mustard: Bool = true
var bacon: Bool = false
var cheese: Bool = false
}
struct CheeseburgerBuilder: BurgerBuilder {
var name: String = "Cheese Burger"
var lettuce: Bool = true
var tomatoes: Bool = true
var onions: Bool = true
var patties: Int = 1
var ketchup: Bool = true
var mustard: Bool = true
var bacon: Bool = false
var cheese: Bool = true
}
struct BaconburgerBuilder: BurgerBuilder {
var name: String = "Bacon Burger"
var lettuce: Bool = true
var tomatoes: Bool = true
var onions: Bool = true
var patties: Int = 1
var ketchup: Bool = true
var mustard: Bool = true
var bacon: Bool = false
var cheese: Bool = true
}
@DarrenHurst
Copy link
Copy Markdown
Author

Screenshot 2023-02-05 at 3 31 08 PM

BurgerBuilderPattern.mov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment