[Swift] どこかれでも共有できる@EnvironmentObject

クラス、メンバー、プロトコル、継承、クラス拡張などを知る

ShareData.swift

class ShareData: ObservableObject {
    @Published var isOn = false
    @Published var num = 1
}

SettingView.swift

struct SettingView: View {
    
    @EnvironmentObject var setData: ShareData
    @Binding var isPresented: Bool
    
    var body: some View {
        NavigationView {
            VStack {
                Toggle(isOn: $setData.isOn){
                    Text("設定: \(setData.isOn ? "ON": "OFF")")
                }.frame(width: 250)
                Stepper(value: $setData.num, in: 1...5){
                    Text("★ :\(setData.num)")
                }
                .frame(width: 250)
                .font(.title2)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(Color(red: 0.9, green: 0.9, blue: 0.5))
                .toolbar {
                    ToolbarItem(placement: .navigationBarTrailing){
                        Button("閉じる"){
                            isPresented = false
                        }
                    }
                }
            }
        }
    }
}

struct SettingView_Previews: PreviewProvider {
    static var previews: some View {
        SettingView(isPresented: Binding.constant(false))
            .environmentObject(ShareData())
    }
}

ContentView.swift

struct ContentView: View {
    @EnvironmentObject var setData: ShareData
    @State var isShow: Bool = false

    var body: some View {
        VStack{
            GroupBox(label: Label("設定", systemImage: "gearshape")){
                Text("\(setData.isOn ? "ON" : "OFF")")
                if setData.isOn {
                    Text(String(repeating: "★", count: setData.num))
                }
            }.frame(width: 300)
            Button (action: {
                isShow = true
            }) {
                Label("設定を変える", systemImage: "ellipsis.circle")
            }
            .padding()
            .sheet(isPresented: $isShow){
                SettingView(isPresented: $isShow)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(ShareData())
    }
}
@main
struct LinkURLSampleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(ShareData())
        }
    }
}

なんかよくわからんくなってきた。
かなり修行が必要やな