swift - 如何在 Swift 中初始化 Struct 中的变量一次

标签 swift struct static

这是我的结构:

struct BookingDetailViewModel {

    private let bookingDetail:BookingDetail

    init(bookingDetail:BookingDetail) {
       self.bookingDetail = bookingDetail
    }

    var pricingCharts:[PricingChartViewModel] {

       let chartArray = bookingDetail.priceCharts

       var pricingChartArray:[PricingChartViewModel] = Array()
        for chart in chartArray {
           let pricingChartViewModel = PricingChartViewModel(pricingChart: chart)
           pricingChartArray.append(pricingChartViewModel)
        }
        return pricingChartArray
    }
}

这是我的 viewModel,当我尝试访问 bookingDetailViewModel.pricingCharts 的值时,从 tableView 数据源访问时会一次又一次地计算内部数组,这对我来说没有任何意义,因为定价图表将始终保持不变。

是否有任何可能的方法只计算一次该定价图表,以便我可以获得更好的性能?

我在设置定价图表时做得正确还是应该遵循其他模式。

最佳答案

您所拥有的是 pricingCharts 的自定义 getter,它的行为应有 - 它会在每次需要时重新计算(即获取)其值。

您需要/想要的是一个lazy var。只需将您的 pricingCharts 更改为:

lazy var pricingCharts:[PricingChartViewModel] = {

   let chartArray = self.bookingDetail.priceCharts

   var pricingChartArray:[PricingChartViewModel] = Array()
    for chart in chartArray {
       let pricingChartViewModel = PricingChartViewModel(pricingChart: chart)
       pricingChartArray.append(pricingChartViewModel)
    }
    return pricingChartArray
}()

进行了三项更改:

    var 之前的
  1. lazy 关键字
  2. = 类型和 block 之间的符号
  3. () block 末尾的大括号

通常你可以红色更多in the docs.

关于swift - 如何在 Swift 中初始化 Struct 中的变量一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990467/

相关文章:

ios - Firebase 既不给出回调也不给出错误

swift - 水平滚动以在 Swift 中显示 PDF

swift - 我已将设备的当前时间格式设置为 24 小时制,现在我需要使用 "am"、 "pm"从 24 小时制计算 12 小时制时间

c++ - 试图在类中定义静态常量变量

c# - C#中构造函数内部的静态成员

java - 堆栈溢出java

ios - 使用 swift 在 tableview 中显示数组项

将数据复制到 C 中结构内部的字符串会导致段错误

go - 强制函数只接受类型,而不是类型的底层类型

python - 通过 Python 从二进制文件访问 ctypes **argv