我有一个定义每个数据集的结构体:
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...
}
你的属性应该以小写字母开头,而不是大写字母,所以应该是tradeDate
和price
。
利用Array
的max(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
)