Swift过滤器和结构数组的映射

时间:2017-06-05 07:31:21

标签: ios swift xcode

我可能有这个错误。菜鸟。我在这里重新创造了我在游乐场类型环境中所做的事情。基本上发件人是其他滑块的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的元素。怎么样?

3 个答案:

答案 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/