无法分配给 属性:'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 中有点奇怪。您可能需要重新考虑一下。