Skip to content

Instantly share code, notes, and snippets.

@christianselig
Created May 14, 2021 18:16
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 christianselig/df08d6995f87493ba5d0a0dbe127c37c to your computer and use it in GitHub Desktop.
Save christianselig/df08d6995f87493ba5d0a0dbe127c37c to your computer and use it in GitHub Desktop.
//
// ContentView.swift
// TestSwiftSettings3
//
// Created by Christian Selig on 2021-05-13.
//
import SwiftUI
import Combine
struct Setting {
enum SettingType {
case toggle
case menu(items: [String])
}
let title: String
let iconName: String
let key: String
let type: SettingType
}
struct ContentView: View {
var settings: [Setting] = [
Setting(title: "I Like Ants", iconName: "ant.fill", key: "likes-ants", type: .toggle),
Setting(title: "Ant Type", iconName: "folder.fill", key: "ant-type", type: .menu(items: ["Fluffy", "Furry", "Scaley"]))
]
var body: some View {
Form {
Section {
ForEach(settings, id: \.key) { (setting) in
switch setting.type {
case .toggle:
ToggleSettingView(setting: setting)
case .menu:
MenuSettingView(setting: setting)
}
}
}
}
}
}
struct ToggleSettingView: View {
let setting: Setting
var body: some View {
Toggle(isOn: getBinding(for: setting), label: {
HStack {
Image(systemName: setting.iconName).foregroundColor(.pink)
Text(setting.title)
}
})
}
func getBinding(for setting: Setting) -> Binding<Bool> {
return Binding<Bool>(
get: {
UserDefaults.standard.bool(forKey: setting.key)
},
set: { (value) in
UserDefaults.standard.set(value, forKey: setting.key)
}
)
}
}
struct MenuSettingView: View {
let setting: Setting
var body: some View {
HStack {
Button(action: {
// What do do on button press? e.g.: set it to option "Scaley" which is at index 2?
}, label: {
HStack {
Image(systemName: setting.iconName).foregroundColor(.pink)
Text(setting.title).foregroundColor(.black)
Spacer()
Text(menuItems[getBinding(for: setting).wrappedValue]).foregroundColor(.gray)
}
})
}
}
var menuItems: [String] {
switch setting.type {
case .menu(let items):
return items
default:
fatalError("Should be menu type")
}
}
func getBinding(for setting: Setting) -> Binding<Int> {
return Binding<Int>(
get: {
UserDefaults.standard.integer(forKey: setting.key)
},
set: { (value) in
UserDefaults.standard.set(value, forKey: setting.key)
}
)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment