DAY 26 (Project 4)BetterRest
iOS開発の真のパワー機能の1つである機械学習(ML)。
すべてのiPhoneには、Core MLと呼ばれるテクノロジーが組み込まれています。
これにより、以前のデータに基づいて新しいデータを予測するコードを作成できます。いくつかの生データから始めて、それをトレーニングデータとしてMacに渡し、その結果を使用して、新しいデータについて正確な推定を行うことができるアプリを構築します。すべてデバイス上で、ユーザーに完全なプライバシーを提供します。
私たちが構築している実際のアプリはBetterRestと呼ばれ、コーヒーを飲む人が3つの質問をすることで安眠を助けるように設計されています。
これが機械学習の出番です。回帰分析と呼ばれる手法を使用して、すべてのデータを表すことができるアルゴリズムをコンピュータに作成するよう依頼できます。これにより、これまでに見たことのない新しいデータにアルゴリズムを適用して、正確な結果を得ることができます。
このプロジェクトのいくつかのファイルをダウンロードする必要があります。これはGitHubから行うことができます:https : //github.com/twostraws/HackingWithSwift
Stepper
struct ContentView: View { @State private var sleepAmount = 8.0 var body: some View { Stepper(value: $sleepAmount, in: 3...12,step: 0.25) { Text("\(sleepAmount, specifier: "%.2f") hours") } } }
DatePickerで日付と時刻を選択する
import SwiftUI import SwiftUI struct ContentView: View { @State private var wakeUp = Date() // when you create a new Date instance it will be set to the current date and time let now = Date() // create a second Date instance set to one day in seconds from now let tomorrow = Date().addingTimeInterval(86400*2) // error // create a range from those two //let range = now...tomorrow var body: some View { // DatePicker("Please enter a date", selection: $wakeUp) // DatePicker("", selection: $wakeUp) // DatePickerにForm: /* Form { DatePicker("Please enter a date", selection: $wakeUp) } */ // 過去は不可 //atePicker("Please enter a date", selection: $wakeUp, in: Date()...) /* DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute) .labelsHidden() */ DatePicker("日時を選択", selection: $wakeUp, in: now...tomorrow) } }
Computed Properties関連でerror有り 改善案
struct ContentView: View { @State private var wakeUp = Date() let now:Date = Date() let tomorrow = Date().addingTimeInterval(86400) var body: some View { DatePicker("日時を選択", selection: $wakeUp, in: now...tomorrow) } }
Create MLを使用したモデルのトレーニング
struct ContentView: View { @State private var wakeUp = Date() @State private var sleepAmount = 8.0 @State private var coffeeAmount = 1 func calculateBedtime() { } var body: some View { NavigationView { VStack { Text("When do you want to wake up?") .font(.headline) DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute) .labelsHidden() // more to come Text("Desired amount of sleep") .font(.headline) Stepper(value: $sleepAmount, in: 4...12, step: 0.25) { Text("\(sleepAmount, specifier: "%g") hours") } Text("Daily coffee intake") .font(.headline) Stepper(value: $coffeeAmount, in: 1...20) { if coffeeAmount == 1 { Text("1 cup") } else { Text("\(coffeeAmount) cups") } } } .navigationBarTitle("BetterRest") .navigationBarItems(trailing: // our button here Button(action: calculateBedtime) { Text("Calculate") } ) } } }
SwiftUIをコアMLに接続する
Pipeline Regressor
検索KEYWORD(The 100 Days of SwiftUI conputed property)
SOLVED: Day 28 – Challenge Three
解決済み:28日目-チャレンジ3
途中経過、NavigationView、alert、navigationBarItemsなど
import SwiftUI struct ContentView: View { @State private var alertTitle = "" @State private var alertMessage = "" @State private var showingAlert = false func calculateBedtime() { showingAlert = true } var body: some View { NavigationView { VStack { Text("When do you want to wake up?") .font(.headline) //alert .alert(isPresented: $showingAlert) { Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("OK"))) } } .navigationBarTitle("BetterRest") .navigationBarItems(trailing: Button(action: calculateBedtime) { Text("Calculate")}) } } }
import SwiftUI struct ContentView: View { @State private var wakeUp = Date() @State private var sleepAmount = 8.0 @State private var coffeeAmount = 1 @State private var alertTitle = "" @State private var alertMessage = "" @State private var showingAlert = false func calculateBedtime() { let model = SleepCalculator() let components = Calendar.current.dateComponents([.hour, .minute], from: wakeUp) let hour = (components.hour ?? 0) * 60 * 60 let minute = (components.minute ?? 0) * 60 //var bedTime = "Please set all input values" do { let prediction = try model.prediction(wake: Double(hour + minute), estimatedSleep: sleepAmount, coffee: Double(coffeeAmount)) // more code here let sleepTime = wakeUp - prediction.actualSleep let formatter = DateFormatter() formatter.timeStyle = .short alertMessage = formatter.string(from: sleepTime) alertTitle = "Your ideal bedtime is…" } catch { // something went wrong! alertTitle = "Error" alertMessage = "Sorry, there was a problem calculating your bedtime." showingAlert = true } showingAlert = true } var body: some View { NavigationView { VStack { Text("When do you want to wake up?") .font(.headline) DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute) .labelsHidden() Text("Desired amount of sleep") .font(.headline) Stepper(value: $sleepAmount, in: 4...12, step: 0.25) { Text("\(sleepAmount, specifier: "%g") hours") } Text("Daily coffee intake") .font(.headline) Stepper(value: $coffeeAmount, in: 1...20) { if coffeeAmount == 1 { Text("1 cup") } else { Text("\(coffeeAmount) cups") } } //alert .alert(isPresented: $showingAlert) { Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("OK")))} } .navigationBarTitle("BetterRest") .navigationBarItems(trailing: Button(action: calculateBedtime) { Text("Calculate")}) } } }
最終版
import SwiftUI struct ContentView: View { static var defaultWakeTime: Date { var components = DateComponents() components.hour = 7 components.minute = 0 return Calendar.current.date(from: components) ?? Date() } @State private var wakeUp = defaultWakeTime //@State private var wakeUp = Date() @State private var sleepAmount = 8.0 @State private var coffeeAmount = 1 @State private var alertTitle = "" @State private var alertMessage = "" @State private var showingAlert = false func calculateBedtime() { let model = SleepCalculator() let components = Calendar.current.dateComponents([.hour, .minute], from: wakeUp) let hour = (components.hour ?? 0) * 60 * 60 let minute = (components.minute ?? 0) * 60 //var bedTime = "Please set all input values" do { let prediction = try model.prediction(wake: Double(hour + minute), estimatedSleep: sleepAmount, coffee: Double(coffeeAmount)) // more code here let sleepTime = wakeUp - prediction.actualSleep let formatter = DateFormatter() formatter.timeStyle = .short alertMessage = formatter.string(from: sleepTime) alertTitle = "Your ideal bedtime is…" } catch { // something went wrong! alertTitle = "Error" alertMessage = "Sorry, there was a problem calculating your bedtime." showingAlert = true } showingAlert = true } var body: some View { NavigationView { //VStack { Form { Text("When do you want to wake up?") .font(.headline) /* DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute) .labelsHidden() */ DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute) .labelsHidden() .datePickerStyle(WheelDatePickerStyle()) VStack(alignment: .leading, spacing: 0) { Text("Desired amount of sleep") .font(.headline) Stepper(value: $sleepAmount, in: 4...12, step: 0.25) { Text("\(sleepAmount, specifier: "%g") hours") } } Text("Daily coffee intake") .font(.headline) Stepper(value: $coffeeAmount, in: 1...20) { if coffeeAmount == 1 { Text("1 cup") } else { Text("\(coffeeAmount) cups") } } //alert .alert(isPresented: $showingAlert) { Alert(title: Text(alertTitle), message: Text(alertMessage), dismissButton: .default(Text("OK")))} } .navigationBarTitle("BetterRest") .navigationBarItems(trailing: Button(action: calculateBedtime) { Text("Calculate")}) } } }