gpt4 book ai didi

ios - Swift Filter 和 Map 结构数组

转载 作者:搜寻专家 更新时间:2023-11-01 07:12:01 26 4
gpt4 key购买 nike

我可能真的错了。小白。我在这里重新创建了我在 Playground 类型环境中所做的事情。基本上,发送者是其他 slider 的 UITableView 中的一个 slider 。 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 float 执行 calcOtherVals,位置 sender.tag 处的元素除外。怎么办?

最佳答案

myData.enumerated().flatMap { (index, element) in return index != sender.tag ? calcOtherVals (element.value) : nil }

这里有一些快速魔法。首先,enumerate() 返回包含元素的元组数组,以及所述元素的索引。

下一个 flatMap()。这本质上是 map 但它会忽略解析为 nil 的任何转换。非常适合从可选数组转换为平面数组,如果您希望执行这样的 map+filter 操作,也非常有用。

-- 已更新--

如果您对隐式参数感到满意,您可以进一步减少它:

myData.enumerated().flatMap { $0.offset != sender.tag ? calcOtherVals ($0.element.value) : nil }

关于ios - Swift Filter 和 Map 结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com