|
| 1 | +// |
| 2 | +// HeartRateZone.swift |
| 3 | +// RNWatch Watch App |
| 4 | +// |
| 5 | +// Created by Runnect on 2026/02/09. |
| 6 | +// |
| 7 | + |
| 8 | +import SwiftUI |
| 9 | + |
| 10 | +enum HeartRateZone: Int, CaseIterable { |
| 11 | + case zone1 = 1 // 워밍업 50-60% |
| 12 | + case zone2 = 2 // 지방 연소 60-70% |
| 13 | + case zone3 = 3 // 유산소 70-80% |
| 14 | + case zone4 = 4 // 젖산 역치 80-90% |
| 15 | + case zone5 = 5 // 최대 90-100% |
| 16 | + |
| 17 | + var name: String { |
| 18 | + switch self { |
| 19 | + case .zone1: return "워밍업" |
| 20 | + case .zone2: return "지방 연소" |
| 21 | + case .zone3: return "유산소" |
| 22 | + case .zone4: return "젖산 역치" |
| 23 | + case .zone5: return "최대" |
| 24 | + } |
| 25 | + } |
| 26 | + |
| 27 | + var color: Color { |
| 28 | + switch self { |
| 29 | + case .zone1: return Color(red: 0x3B / 255, green: 0x82 / 255, blue: 0xF6 / 255) |
| 30 | + case .zone2: return Color(red: 0x22 / 255, green: 0xC5 / 255, blue: 0x5E / 255) |
| 31 | + case .zone3: return Color(red: 0xEA / 255, green: 0xB3 / 255, blue: 0x08 / 255) |
| 32 | + case .zone4: return Color(red: 0xF9 / 255, green: 0x73 / 255, blue: 0x16 / 255) |
| 33 | + case .zone5: return Color(red: 0xEF / 255, green: 0x44 / 255, blue: 0x44 / 255) |
| 34 | + } |
| 35 | + } |
| 36 | + |
| 37 | + var shortLabel: String { |
| 38 | + "Z\(rawValue)" |
| 39 | + } |
| 40 | + |
| 41 | + var range: ClosedRange<Double> { |
| 42 | + switch self { |
| 43 | + case .zone1: return 0.50...0.60 |
| 44 | + case .zone2: return 0.60...0.70 |
| 45 | + case .zone3: return 0.70...0.80 |
| 46 | + case .zone4: return 0.80...0.90 |
| 47 | + case .zone5: return 0.90...1.00 |
| 48 | + } |
| 49 | + } |
| 50 | + |
| 51 | + static func zone(for heartRate: Double, maxHeartRate: Double = 190) -> HeartRateZone { |
| 52 | + guard maxHeartRate > 0 else { return .zone1 } |
| 53 | + let ratio = heartRate / maxHeartRate |
| 54 | + |
| 55 | + switch ratio { |
| 56 | + case ..<0.60: return .zone1 |
| 57 | + case 0.60..<0.70: return .zone2 |
| 58 | + case 0.70..<0.80: return .zone3 |
| 59 | + case 0.80..<0.90: return .zone4 |
| 60 | + default: return .zone5 |
| 61 | + } |
| 62 | + } |
| 63 | +} |
0 commit comments