添加自定义数组SwiftUI的元素
Posted
技术标签:
【中文标题】添加自定义数组SwiftUI的元素【英文标题】:Add elements of custom array SwiftUI 【发布时间】:2020-08-08 18:13:42 【问题描述】:所以我有一个Dice
的结构,它附加了一些属性。我希望能够将它们全部加在一起,这样我就有了一个干净的价值。这是结构:
struct Dice: Identifiable, Hashable
var id = UUID()
var displayValue: String
var initialValue: Int
var endingValue: Int
mutating func roll()
let randomInt = Int.random(in: initialValue..<endingValue)
displayValue = "\(randomInt)"
print("Initial: \(initialValue), EndingValue: \(endingValue), Display: \(displayValue)")
它们存储在此处的数组中:@State var viewArray: [Dice] = []
,然后显示在此处的 ForEach 中:
ForEach(0..<viewArray.count, id: \.self) index in
DiceView(dice: viewArray[index])
.onTapGesture
self.viewArray.remove(at: index)
withAnimation(.spring())
我想做的事情是抓住viewArray
中每个项目的displayValue
并将它们加在一起。这样做的最佳方法是什么?我假设我需要根据displayValue
的属性创建某种数组,然后将该数组相加,但我还没有遇到过。
【问题讨论】:
所以你想从数组中的所有 displayValue 字符串中创建一个字符串,我建议map
将属性放入一个数组,然后joined
从数组中创建一个字符串
哎呀!那是我的错,displayValue
实际上应该是Int
但基本上是的。我将如何使用 map 直接获取 displayValue 属性?我看到的示例仅用于获取直接值,但由于我的数组是自定义类型,我如何映射自定义值?
不确定我是否遵循,map
的主要用途是获取单个属性。也许你应该阅读使用map
。
【参考方案1】:
如果我理解正确,你可以试试map
+ reduce
。
假设displayValue
是Int
类型(正如您在cmets 中提到的):
var viewArray: [Dice] = ...
let sum = viewArray.map(\.displayValue).reduce(0, +)
假设displayValue
是String
类型,您需要先将其转换为Int
:
var viewArray: [Dice] = ...
let sum = viewArray.map(\.displayValue).compactMap(Int.init).reduce(0, +)
【讨论】:
谢谢!我想我最终解决了它,但有点冗长:let rollValues = viewArray.compactMap Int($0.displayValue) let total = rollValues.reduce(0,+) print("\(total)")
我认为原理相同但方法不同。谢谢!【参考方案2】:
根据@joakim,我最终通过创建解决了这个问题:
let rollValues = viewArray.compactMap Int($0.displayValue)
let total = rollValues.reduce(0,+)
print("\(total)")
然后将其分配给我需要显示的变量。像魅力一样工作!
【讨论】:
以上是关于添加自定义数组SwiftUI的元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Equatable 创建扩展以删除自定义数组元素?