xcode 如何更新一个结构值?

slmsl1lt  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(114)

我有一些每月数据,需要在显示之前计算特定值,方法是:

.onAppear{
     ForEach(monthlyTilt) {item in
          item.degrees = NewValue…        
     }
 }

具有以下结构/变量组合:

struct MonthlyTilt: Identifiable {
    var id = UUID().uuidString
    var month: String
    var day: Int
    var degrees: Double
}

var monthlyTilt = [
    MonthlyTilt(month: "Jan",  day: 15,  degrees: 0.0),
    MonthlyTilt(month: "Feb",  day: 46,  degrees: 0.0),
    MonthlyTilt(month: "Mar",  day: 74,  degrees: 0.0),
    MonthlyTilt(month: "Apr",  day: 105, degrees: 0.0),
    MonthlyTilt(month: "May",  day: 135, degrees: 0.0),
    MonthlyTilt(month: "Jun",  day: 166, degrees: 0.0),
    MonthlyTilt(month: "Jul",  day: 196, degrees: 0.0),
    MonthlyTilt(month: "Aug",  day: 227, degrees: 0.0),
    MonthlyTilt(month: "Sept", day: 258, degrees: 0.0),
    MonthlyTilt(month: "Oct",  day: 288, degrees: 0.0),
    MonthlyTilt(month: "Nov",  day: 319, degrees: 0.0),
    MonthlyTilt(month: "Dec",  day: 349, degrees: 0.0)
]

错误消息显示:无法分配给属性:"item"是"let"常量。monthlyTilt设置为变量。
如何更新度值?

o0lyfsai

o0lyfsai1#

你正在尝试更新一个struct,默认情况下它是不可变的,有几种不同的方法可以实现这一点,一种方法是只在你得到构建结构体所需的数据时才填充monthlyTilt变量,你可能还想更新你的数据源以包括月份和日期。

import SwiftUI

public struct FBKChatBotView: View {
    @State private var tilts: [MonthlyTilt] = []
    
    public var body: some View {
      VStack {
        ForEach(tilts) { tilt in
          Text("Tilt is \(tilt.degrees) degrees")
        }
      }
        .onAppear {
           someDataSource() { items in
             items.forEach { item in
               let tilt = MonthlyTilt(month: item.month, day: item.day, degrees: item.degrees)
               tilts.append(tilt)
             }
           }
        }
    }
}

另一种方法是设置一个ObservableObject来处理构建一个@Published倾斜数组的列表,当它发生变化时,您的视图将更新,然后您可以删除onAppear

  • 或者 *,您可以在结构体中创建一个mutating函数,允许它设置/覆盖自己的变量。
struct MonthlyTilt: Identifiable {
    var id = UUID().uuidString
    var month: String
    var day: Int
    var degrees: Double

    mutating func setDegrees(_ to: Double) {
       degrees = to
    }
}

我不知道为什么,但我从来没有真正喜欢最后一个(mutating)选项,因为它打开了其他东西的大门,也改变了结构,然后你失去了一个不可变结构的严格性。我不知道这是最佳实践或个人喜好,但我几乎总是尽量不使结构可变。

  • 示例代码是从我的头顶,所以原谅任何错别字 *

相关问题