快速过滤和映射结构数组

Sea*_*ean 1 xcode ios swift

我可能真的错了。小白。我在这里重现了我在游乐场类型环境中所做的事情。基本上,发送者是其他滑块的 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
Run Code Online (Sandbox Code Playgroud)

所以基本上我尝试使用过滤器和映射以及 calcOtherVals 闭包来编辑结构数组。我可以使用条件和循环以及 calcOtherVals 作为函数来做到这一点,没有问题。只是希望能做得更优雅。

问题:如代码注释中所示,我需要calcOtherVals对 myData 中的所有 .value 浮点执行操作,除了位置 处的元素sender.tag。如何?

Xma*_*hts 5

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

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

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

- 更新 -

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

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