将循环转换为快速的高阶函数

时间:2019-02-01 08:47:45

标签: ios swift

我正在 Swift 4.2 中编写 iOS应用 我遍历数组1 ,并对其一个元素进行了更改,并将这些元素添加到数组2

数组:

let array:[model] = []
let array2:[model] = []

此数组的模型为:

class model: NSObject {
    var id:Int = 0
    var name:String=""
    var isChecked:Bool=false
}

功能

    func customCheckboxValueChangedWithID(_ id: Int, isChecked: Bool) {
array2.removeAll()
            //TODO, use sugar syntax/higher order function for this loop:
            for element in array{
                if(element.id==id){
                    element.isChecked=isChecked
if(element.isChecked){
array2.append(element)
}
                }
            }
            reloadCollectionView()
        }

如何将其转换为快速的高阶函数,例如mapflatMap等?

6 个答案:

答案 0 :(得分:4)

您可以这样做:

array.forEach { if $0.id == id { $0.isChecked.toggle() } }

如果只想过滤元素,而只保留其isChecked属性设置为true的元素,则可以使用以下方法:

let newArray = array.filter { $0.isChecked }

答案 1 :(得分:2)

您可以使用过滤器

numbers.forEach({ if $0.id == id { $0.isChecked = isChecked } })(SPatel的评论)

遍历一个集合,并返回一个包含满足条件的元素的数组。

让我们假设仅在以下数组示例中需要过滤偶数。传统方法可以是:

let numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15]

// The traditional way
var evenNumArray: [Int] = []
for number in numbersArray {
  if number % 2 == 0 {
    evenNumArray.append(number)
  }
}
// evenNumArray = [2, 4, 6, 8, 10, 14]

相反,让我们对相同的结果使用过滤器:

let numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15]
// Filter
let evenArray = numbersArray.filter { $0 % 2 == 0 }

Simple Higher Order Functions in Swift

答案 2 :(得分:0)

您可以像这样重写...

array.forEach {
    if $0.id == someID { $0.isChecked = isChecked }
}

这仅适用于您使用的类。

如果您切换到使用结构,那么您可能会...

let newArray = array.map {
    if $0.if == someID {
        var theModel = $0
        theModel.isChecked = isChecked
        return theModel
    }
    return $0
}

答案 3 :(得分:0)

由于您有一系列的类,因此非常简单:

let array: [model] = [...]

array.first { $0.id == id }?.isChecked = isChecked

如果有一个结构数组,则需要更新原始数组或创建一个全新的数组:

var array: [model] = []

// updating element in the original array
if let index = array.index(where: { $0.id == id }) {
   array[index].isChecked = isChecked
}

// updating the whole array
array = array.map {
   guard $0.id == id else { return $0 }
   var element = $0
   element.isChecked = isChecked
   return element 
}

答案 4 :(得分:0)

如何使用“ flatMap”

这是游乐场的来源

//: Playground - noun: a place where people can play

import UIKit

struct model {
    var id:Int = 0
    var name:String=""
    var isChecked:Bool=false
}

let array:[model] = [model(id: 0, name: "0", isChecked: false),
model(id: 1, name: "1", isChecked: false),
model(id: 2, name: "2", isChecked: false),
model(id: 3, name: "3", isChecked: false),
model(id: 4, name: "4", isChecked: false),
model(id: 5, name: "5", isChecked: false),
model(id: 6, name: "6", isChecked: false)
]
var array2:[model] = []


func customCheckboxValueChangedWithID(_ id: Int, isChecked: Bool) {
    array2 = array.flatMap { (ma: model) -> model? in
        var element = ma

        if element.id == id {
            element.isChecked = isChecked
            return element
        }
        return nil
    }
}


customCheckboxValueChangedWithID(1, isChecked: true)
print("array2 : \(array2)")

结果: array2:[__lldb_expr_53.model(id:1,name:“ 1”,isChecked:true)]

答案 5 :(得分:0)

您可以尝试以下方法:

class MyObj: CustomStringConvertible {
    var id: String
    var isChecked: Bool

    init(id: String = "", isChecked: Bool = false) {
        self.id = id
        self.isChecked = isChecked
    }

    var description: String {
        return "MyObj(id: \(id), isChecked: \(isChecked)"
    }
}

let array = [
    MyObj(id: "id1"),
    MyObj(id: "id1", isChecked: true),
    MyObj(id: "id2"),
    MyObj(id: "id3", isChecked: true)
]

func customCheckboxValueChanged(_ values: [MyObj], id: String, isChecked: Bool) -> [MyObj] {
    let sameIDModels: [MyObj] = values
        .filter { $0.id == id }
        .map { $0.isChecked = isChecked; return $0 }

    return sameIDModels.filter{ $0.isChecked }
}

let isChecked = true
let myID = "id1"

print(customCheckboxValueChanged(array, id: myID, isChecked: isChecked))