AlarmBGSection.swift 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // LoopFollow
  2. // AlarmBGSection.swift
  3. import HealthKit
  4. import SwiftUI
  5. struct AlarmBGSection: View {
  6. // MARK: – public parameters
  7. let header: String?
  8. let footer: String?
  9. let title: String
  10. let range: ClosedRange<Double>
  11. // MARK: – underlying optional binding
  12. @Binding private var value: Double?
  13. // MARK: – designated initialiser
  14. init(
  15. header: String? = nil,
  16. footer: String? = nil,
  17. title: String,
  18. range: ClosedRange<Double>,
  19. value: Binding<Double?>
  20. ) {
  21. self.header = header
  22. self.footer = footer
  23. self.title = title
  24. self.range = range
  25. _value = value
  26. }
  27. // MARK: – derived non-optional binding
  28. private var nonOptional: Binding<Double> {
  29. Binding(
  30. get: { value ?? range.lowerBound },
  31. set: { newVal in value = newVal }
  32. )
  33. }
  34. // MARK: – view
  35. var body: some View {
  36. Section(
  37. header: header.map(Text.init),
  38. footer: footer.map(Text.init)
  39. ) {
  40. BGPicker(
  41. title: title,
  42. range: range,
  43. value: nonOptional
  44. )
  45. }
  46. }
  47. }