无法分配给 属性:'selectedDealClosingDate' 是一个只获取 属性 - SwiftUI
Cannot assign to property: 'selectedDealClosingDate' is a get-only property - SwiftUI
我正在使用 DatePicker 将所选日期存储在格式字符串中的核心数据中,因此我使用了一个计算 属性 returns 一个字符串并使用了一个接受类型的 DateFormatter要转换为字符串的日期。
我有另一个视图,它从 CoreData 中获取字符串类型的存储日期。
因此,为了将该字符串日期转换为要在日期选择器中获取的日期类型,我创建了一个计算 属性 类型 returns 类型日期并使用 dateFormatter 我将获取的日期类型转换为要键入日期的字符串。
选择器需要一个绑定日期,我正在关注 MVVM,所以我有一个 ExistingDealDetailsViewModel,我从那里访问 dealClosingDate。
但是编译器给我错误:
“无法分配给 属性:'selectedDealClosingDate' 是一个只能获取的 属性”。
Requirement/Goal: 我想检索存储的日期并将其显示在DatePicker中作为所选日期。
感谢您提供的所有帮助,谢谢。
现有交易视图:
VStack {
Text("Deal Closing Date")
.foregroundColor(.gray)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
DatePicker("Select a date:", selection: $existingDealDetailsVM.selectedDealClosingDate, displayedComponents: [.date]) //Error is shown at this line
.padding()
.overlay(RoundedRectangle(cornerRadius: 0)
.stroke(lineWidth: 1)
.foregroundColor(.gray))
.datePickerStyle(.compact)
}
.padding()
ExistingDealDetailsViewModel:
import SwiftUI
class ExistingDealDetailsViewModel: ObservableObject {
@Published var toggle: Bool = false
func update(){
CoreDataManager.shared.save()
}
var deal = Deal() // Deal is a CoreData Entity Class
var dateFormatter = DateFormatter()
var selectedDealClosingDate: Date {
var dealClosingDate = deal.dealClosingDate //dealClosingDate is of type String
dateFormatter.dateFormat = "dd/MM/YY"
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
}
想一想当用户使用日期选择器更改选择时会发生什么 - 您会希望 selectedDealClosingDate
设置为新选择的值,不是吗?但是看看你声明的方式selectedDealClosingDate
!您只定义了如何计算它的值,但没有定义如何设置它的值。
var selectedDealClosingDate: Date {
var dealClosingDate = deal.dealClosingDate
dateFormatter.dateFormat = "dd/MM/YY"
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
你应该添加一个 setter:
var dateFormatter = {
let formatter = DateFormatter()
formatter = .dateFormat = "dd/MM/yy"
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
var selectedDealClosingDate: Date {
get {
var dealClosingDate = deal.dealClosingDate
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
set {
deal.dealClosingDate = dateFormatter.string(from: newValue)
}
}
此外,我发现您将交易结束日期作为字符串存储在 Core Data 中有点奇怪。您可能需要重新考虑一下。
我正在使用 DatePicker 将所选日期存储在格式字符串中的核心数据中,因此我使用了一个计算 属性 returns 一个字符串并使用了一个接受类型的 DateFormatter要转换为字符串的日期。
我有另一个视图,它从 CoreData 中获取字符串类型的存储日期。
因此,为了将该字符串日期转换为要在日期选择器中获取的日期类型,我创建了一个计算 属性 类型 returns 类型日期并使用 dateFormatter 我将获取的日期类型转换为要键入日期的字符串。
选择器需要一个绑定日期,我正在关注 MVVM,所以我有一个 ExistingDealDetailsViewModel,我从那里访问 dealClosingDate。
但是编译器给我错误: “无法分配给 属性:'selectedDealClosingDate' 是一个只能获取的 属性”。
Requirement/Goal: 我想检索存储的日期并将其显示在DatePicker中作为所选日期。
感谢您提供的所有帮助,谢谢。
现有交易视图:
VStack {
Text("Deal Closing Date")
.foregroundColor(.gray)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
DatePicker("Select a date:", selection: $existingDealDetailsVM.selectedDealClosingDate, displayedComponents: [.date]) //Error is shown at this line
.padding()
.overlay(RoundedRectangle(cornerRadius: 0)
.stroke(lineWidth: 1)
.foregroundColor(.gray))
.datePickerStyle(.compact)
}
.padding()
ExistingDealDetailsViewModel:
import SwiftUI
class ExistingDealDetailsViewModel: ObservableObject {
@Published var toggle: Bool = false
func update(){
CoreDataManager.shared.save()
}
var deal = Deal() // Deal is a CoreData Entity Class
var dateFormatter = DateFormatter()
var selectedDealClosingDate: Date {
var dealClosingDate = deal.dealClosingDate //dealClosingDate is of type String
dateFormatter.dateFormat = "dd/MM/YY"
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
}
想一想当用户使用日期选择器更改选择时会发生什么 - 您会希望 selectedDealClosingDate
设置为新选择的值,不是吗?但是看看你声明的方式selectedDealClosingDate
!您只定义了如何计算它的值,但没有定义如何设置它的值。
var selectedDealClosingDate: Date {
var dealClosingDate = deal.dealClosingDate
dateFormatter.dateFormat = "dd/MM/YY"
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
你应该添加一个 setter:
var dateFormatter = {
let formatter = DateFormatter()
formatter = .dateFormat = "dd/MM/yy"
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
var selectedDealClosingDate: Date {
get {
var dealClosingDate = deal.dealClosingDate
return dateFormatter.date(from: dealClosingDate) ?? Date.now
}
set {
deal.dealClosingDate = dateFormatter.string(from: newValue)
}
}
此外,我发现您将交易结束日期作为字符串存储在 Core Data 中有点奇怪。您可能需要重新考虑一下。