我已經(在一些幫助下)創建了一個名為 SleepModel 的結構,其中包含我所有的睡眠變數。然后我有一個名為 AddEntryView 的視圖,用于在應用程式中添加一個睡眠條目。在該視圖中是用戶填寫的文本欄位和選擇器以及底部的按鈕。當用戶單擊按鈕時,它將輸入保存到 CoreData。我的問題是它一直在說'可選型別'Double的值?對于從文本欄位中提取的變數,必須將其解包為“Double”型別的值。這是因為文本欄位是一個字串,我正在嘗試將其轉換為雙精度以保存,以便以后可以使用它進行數學運算。想法?
它不斷崩潰還說這總是 Nil:
if newSleep != nil {
var hoursSleptDouble = Double(hoursSlept)
newSleep!.hoursSlept = hoursSleptDouble ?? 0.0
coreDataViewModel.saveRecord(sleepModel: newSleep!) {
print("Success")
}
}
我的代碼如下:
我有一個名為“SleepEntity”的物體的 SleepContainer CoreData 檔案。在那里我有兩個變數(id 作為 UUID,hoursSlept 作為雙精度)。
ADDENTRYVIEW(有更多關于附加欄位的注釋,但我試圖先弄清楚文本欄位)
import SwiftUI
struct AddEntryView: View {
// Call CoreData for saving/reading data
@StateObject var coreDataViewModel = CoreDataViewModel()
// New empty Sleep object for user input
@State var newSleep: SleepModel!
@State var hoursSlept = String()
var body: some View {
ZStack {
Rectangle()
.fill(Color(hue: 0.587, saturation: 0.619, brightness: 0.907)).ignoresSafeArea()
VStack {
Text("ADD SLEEP ENTRY")
.font(.system(size: 32.0)).fontWeight(.heavy)
.bold()
.foregroundColor(.black)
HStack {
DatePicker(selection: .constant(Date()), displayedComponents: .date, label: { Text("Date")})
}
Text("Sleep Basics")
.font(.system(size: 16.0)).fontWeight(.heavy)
.bold()
.foregroundColor(.black)
.padding()
Section {
HStack{
Text("Hours Slept")
Spacer()
TextField("Hours Slept", text:$hoursSlept).padding(.leading, 75)
}.multilineTextAlignment(.trailing)
Button(action: {
if newSleep != nil {
var hoursSleptDouble = Double(hoursSlept)
newSleep!.hoursSlept = hoursSleptDouble ?? 0.0
coreDataViewModel.saveRecord(sleepModel: newSleep!) {
print("Success")
}
}
})
{
Capsule()
.foregroundColor(Color.green)
.frame(height: 44)
.overlay(Text("Add Entry").foregroundColor(Color.white).bold())
}.padding()
}.padding()
.background(Color.white)
.clipShape(RoundedRectangle(cornerRadius: 25.0, style: .continuous))
.padding()
}
}
}
struct AddEntryView_Previews: PreviewProvider {
static var previews: some View {
AddEntryView()
}
}
SLEEPMODEL.swift (同樣,有更多變數,但在我弄清楚這部分之前被注釋掉了)
import Foundation
struct SleepModel: Identifiable, Hashable {
var id = UUID().uuidString // ID variable
var hoursSlept: Double // Hours slept variable
}
uj5u.com熱心網友回復:
這里的主要問題是我們在錯誤的 IMO 范圍內使用模型物件的代碼。您根本不需要將它作為屬性,而是等待創建它,直到您真正需要它。
因此,第 1 步將洗掉 的宣告,newSleep然后第 2 步將按鈕操作中的代碼移動到單獨的函式中,因為它使代碼的意圖更清晰。第 3 步是重構代碼,使其表現更好
這是您隨后從按鈕操作呼叫的函式
private func saveSleepModel() {
guard let hoursSleptDouble = Double(hoursSlept) else {
print("hours slept is invalid")
return
}
var sleepModel = SleepModel(hoursSlept: hoursSleptDouble)
coreDataViewModel.saveRecord(sleepModel: sleepModel) {
print("Success")
}
}
以下步驟將讓您以與使用相同的方式處理函式的其他屬性,hoursSlept以及比使用更好的反饋/錯誤處理print
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507545.html
