|
//: [Previous](@previous) |
|
import SwiftUI |
|
import PlaygroundSupport |
|
|
|
public struct Metadata: Codable { |
|
var name: String |
|
var int: Int |
|
var bool: Bool |
|
|
|
init(){ |
|
name = "name" |
|
int = 0 |
|
bool = false |
|
} |
|
} |
|
|
|
class Instrument<T>: ObservableObject { |
|
@Published var metadata: Metadata |
|
@Published var object: T |
|
|
|
init(object: T, metadata: Metadata = Metadata()){ |
|
self.metadata = metadata |
|
self.object = object |
|
} |
|
} |
|
|
|
class Trumpet: NSObject, ObservableObject { |
|
@Published var name: String |
|
@Published var int: Int |
|
@Published var bool: Bool |
|
|
|
init(name: String = "newTrumpet", int: Int = 1, bool: Bool = true){ |
|
self.name = name |
|
self.int = int |
|
self.bool = bool |
|
} |
|
} |
|
|
|
class Guitar: NSObject, ObservableObject { |
|
@Published var name: String |
|
@Published var int: Int |
|
@Published var bool: Bool |
|
|
|
init(name: String = "newGuitar", int: Int = 2, bool: Bool = true){ |
|
self.name = name |
|
self.int = int |
|
self.bool = bool |
|
} |
|
} |
|
|
|
class Clarinet: NSObject, ObservableObject { |
|
@Published var name: String |
|
@Published var int: Int |
|
@Published var bool: Bool |
|
|
|
init(name: String = "newClarinet", int: Int = 3, bool: Bool = true){ |
|
self.name = name |
|
self.int = int |
|
self.bool = bool |
|
} |
|
} |
|
|
|
|
|
//VIEWS |
|
|
|
struct ContentView: View { |
|
|
|
@StateObject var trumpet: Instrument<Trumpet> = Instrument<Trumpet>(object: Trumpet(name: "testTrumpet")) |
|
@StateObject var guitar: Instrument<Guitar> = Instrument<Guitar>(object: Guitar(name: "testGuitar")) |
|
@StateObject var clarinet: Instrument<Clarinet> = Instrument<Clarinet>(object: Clarinet(name: "testClarinet")) |
|
|
|
// var instrument: Instrument<T> { return trumpet} /// doesn't work but I'd like it to |
|
|
|
var body: some View { |
|
InstrumentView(instrument: trumpet) // would prefer it were InstrumentView(instrument: instrument) (see above) |
|
.environmentObject(trumpet) // would prefer it were .environmentObject(instrument) (see above) |
|
.frame(width: 300, height: 100) |
|
} |
|
} |
|
|
|
struct InstrumentView<T>: View { |
|
|
|
var instrument: Instrument<T> |
|
|
|
var body: some View { |
|
|
|
if type(of: instrument) == Instrument<Trumpet>.self { |
|
Text("Instrument is a trumpet") |
|
Text("\(instrument.metadata.name)") |
|
Text("\(instrument.metadata.int)") |
|
// Text("\(instrument.object.name)") // doesn't work !! |
|
Text((instrument.object as! Trumpet).name) // THIS WORKS!! AWKWARD THOUGH :-/ |
|
} else |
|
|
|
if type(of: instrument) == Instrument<Guitar>.self { |
|
Text("Instrument is a guitar") |
|
Text("\(instrument.metadata.name)") |
|
Text("\(instrument.metadata.int)") |
|
} |
|
|
|
else { |
|
Text("Instrument is a clarinet") |
|
} |
|
|
|
} |
|
} |
|
|
|
PlaygroundPage.current.setLiveView(ContentView()) |
|
//: [Next](@next) |
I'd like to be able to access all the variables from instrument.object when inside the InstrumentView.