我正在 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()
}
如何将其转换为快速的高阶函数,例如map
,flatMap
等?
答案 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 }
答案 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))