计算跨一组数据结构的字段的最大值



我有一个定义每个数据集的结构体:

struct TimeSeries: Codable, Hashable {
var TradeDate: Date
var Price: Double
}

和一些符合此数据类型的虚拟数据

var dummyData = [
TimeSeries(
TradeDate: "2021-01-01"
Price: 101.0),
TimeSeries(
TradeDate: "2021-01-02"
Price: 102.0),
TimeSeries(
TradeDate: "2021-01-03"
Price: 103.0),
TimeSeries(
TradeDate: "2021-01-04"
Price: 104.0)
]

在SwiftUI视图中,我想计算数组中价格的最大值。

struct ContentView: View {
var data: [TimeSeries] = dummyData
var body: some View {
let maximum = data.Price.max()
HStack {
print(String(maximum))
}
}
}

这行不通。我哪里做错了?

我还尝试将Price数组映射到一个新的数组,如

let pricearray = dummyData.map {$0.Price}
let pricemax = pricearray.max()

但这也行不通。

为你的ContentView创建一个计算属性,从数组中计算最大价格

struct ContentView: View {
var data: [TimeSeries] = dummyData
var maxPrice: Double {
data.map(.Price).max() ?? 0.0
}

//rest of code...
}

你的属性应该以小写字母开头,而不是大写字母,所以应该是tradeDateprice

利用Arraymax(by:)函数可以很容易地计算出价格最高的TimeSeries实例,如下所示:

struct ContentView: View {
var data: [TimeSeries] = dummyData
var body: some View {
let maximum = data.max { $0.Price < $1.Price }
HStack {
Text(maximum?.TradeDate ?? "nil")
}
}
}

除此之外,我建议你遵循Swift的API设计指南,即:

遵循大小写约定。类型和协议的名称为UpperCamelCase。

func getMax (InputArray: [Double]) -> Double {
return InputArray.max()!
}

然后在body

let prices = data.map {$0.Price}
let maximum = getMax(InputArray: prices)

有两种形式的Array max方法:max()max(by:)

简单的max()版本只有在数组中的对象符合Comparable

时才有效max(by:)方法接受一个比较两个元素的闭包(类似于sorted(by:))。

为了找到数组中的最大条目数,您可以使用:

var body: some View {
let maximum = data.Price.max {
$0.Price < $1.Price
}
HStack {
print(String(maximum))
}
}

(注意结构体的属性应该以小写字母开头,所以Price应该是price)

最新更新