如何使用 Swift 更新数组中所有元素的特定属性值

Zin*_*tet 3 arrays swift

假设我已经有一个数组,ViewHolder其中viewHolderList: [ViewHolder]. 我希望所有isMarried元素字段在一行中都为“ false ”而不循环。

struct ViewHolder {
    var name: String?
    var age: Int?
    var isMarried: Bool = true
}
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 21

indices您只需要使用方法迭代数组forEach并使用数组索引来更新其元素属性:

struct ViewHolder {
    let name: String
    let age: Int
    var isMarried: Bool
}

var viewHolders: [ViewHolder] = [.init(name: "Steve Jobs", age: 56, isMarried: true),
                                 .init(name: "Tim Cook", age: 59, isMarried: true)]


viewHolders.indices.forEach {
    viewHolders[$0].isMarried = false
}

viewHolders  // [{name "Steve Jobs", age 56, isMarried false}, {name "Tim Cook", age 59, isMarried false}]
Run Code Online (Sandbox Code Playgroud)

您还可以扩展 MutableCollection 并创建一个变异方法来映射集合元素的特定属性,如下所示:

extension MutableCollection {
    mutating func mapProperty<T>(_ keyPath: WritableKeyPath<Element, T>, _ value: T) {
        indices.forEach { self[$0][keyPath: keyPath] = value }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

viewHolders.mapProperty(\.isMarried, false)
viewHolders  // [{name "Steve Jobs", age 56, isMarried false}, {name "Tim Cook", age 59, isMarried false}]
Run Code Online (Sandbox Code Playgroud)