我可能有这个错误。菜鸟。我在这里重新创造了我在游乐场类型环境中所做的事情。基本上发件人是其他滑块的UITableView中的滑块。 myData是底层数据。我想对基础数据的所有项目执行计算,除了对应于发件人项目的项目。我不知道我的闭包语法是否正确。这是我第一次创建一个。
// sender comes over as a struct
struct myStruct {
var tag: Int = 0
var value: Float = 0
}
let sender = myStruct(tag: 1, value: 199)
// some vars for the calculation
let globalTotal: Float = 597
let globalAnotherTotal: Float = 0
// an array of data structs
struct myDataStruct {
var name: String = ""
var value: Float = 0
}
var myData: [myDataStruct] = []
myData.append(myDataStruct(name: "Tom", value: 45.0))
myData.append(myDataStruct(name: "Dick", value: 16.4))
myData.append(myDataStruct(name: "Harry", value: 12.3))
// a closure to do the calculation
var calcOtherVals: (Float, Float) -> (Float) = { (startVal, senderStartVal) in
let remainingStartVals = globalTotal - senderStartVal
let remainingNewVal = globalTotal - sender.value - globalAnotherTotal
let endVal = ((startVal * (100 / remainingStartVals)) / 100) * remainingNewVal
return endVal
}
// now need to perform calcOtherVals on all the .value floats in myData EXCEPT the element at position sender.tag hopefully using filter and map
所以基本上我尝试使用filter和map以及calcOtherVals闭包来编辑结构数组。我可以使用条件和循环和calcOtherVals作为函数没有问题。只是希望能更优雅地做到这一点。
问题:在代码注释中,我需要对myData中的所有.value浮点数执行calcOtherVals
,除了位置sender.tag
的元素。怎么样?
答案 0 :(得分:1)
据我了解你需要过滤你的数组
之类的东西let filteredData = myData.filter({$0.tag != sender.tag})
然后使用reduce来计算
let sumAll = filterdData.reduce(0, {$0.value + $1.value})
答案 1 :(得分:1)
myData.enumerated().flatMap { (index, element) in return index != sender.tag ? calcOtherVals (element.value) : nil }
这里很少有快速的魔法。首先,enumerate()
返回包含元素的元组数组,以及所述元素的索引。
下一个flatMap()
。这基本上是map
但它忽略了解析为nil的任何变换。非常适合从可选数组转换为平面数组,如果您希望执行此类地图+过滤操作,也非常棒。
- 更新 -
如果您对隐式参数感到满意,可以进一步减少它:
myData.enumerated().flatMap { $0.offset != sender.tag ? calcOtherVals ($0.element.value) : nil }
答案 2 :(得分:0)
这个问题已经有了答案,
为了更好地理解,您可以查看有关map,filter和reduce的非常好的教程
链接: - https://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/