Skip to content

Instantly share code, notes, and snippets.

@transat
Last active March 29, 2021 02:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save transat/4bc40f5fae5c9990d905a3e2b7ff244c to your computer and use it in GitHub Desktop.
Save transat/4bc40f5fae5c9990d905a3e2b7ff244c to your computer and use it in GitHub Desktop.
SharedObject
//: [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)
@transat
Copy link
Author

transat commented Mar 29, 2021

I'd like to be able to access all the variables from instrument.object when inside the InstrumentView.

@transat
Copy link
Author

transat commented Mar 29, 2021

UPDATE: I've solved the InstrumentView problem, though the code looks awkward.

Still need to solve the ContentView issue though!

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