首页 > 解决方案 > Swift:确定自定义对象数组是否包含特定字符串

问题描述

我有一个名为 carArray 的数组,它是一个汽车数组。
如何编写函数来确定数组是否包含特定模型?例如,如果用户输入“BMW”,我如何确定它是否在数组中?每次发生这种情况时,我都试图通过编写一个 for 循环来遍历整个数组来避免回答这个问题。

struct Car {
    var make: String?
    var model: String?
    var year: Double?
}

var carArray: [Car] = []

carArray.append(Car(make: "Audi", model: "S5", year: 2015))
carArray.append(Car(make: "BMW", model: "X3", year: 2016))
carArray.append(Car(make: "Honda", model: "Accord", year: 2018))

标签: arraysswiftsearchcontains

解决方案


添加这样的东西

func contains(make: String) -> Bool {
    carArray.compactMap(\.make).contains(make)
} // returns true in your case for "BMW"

这有两个部分。首先,我String?通过映射生成键路径将 Car 对象数组映射到一个数组。因为这可能有 nil 值,所以我compactMap用来删除 nil 值。

如果您要经常这样做并且不希望每次都进行映射和检查的开销,那么请创建一些东西来存储您的汽车。像这样的东西:

struct Car {
    var make: String?
    var model: String?
    var year: Double?
}

struct CarStore {
    private(set) var  storage: [Car] = .init()
    private var makes: Set<String> = .init()

    mutating func add(car: Car) {
        storage.append(car)
        car.make.map { makes.insert($0) } // map to run the closure only if make is not nil
    }

    func contains(make: String) -> Bool {
        makes.contains(make)
    }
}

var store = CarStore()

store.add(car: Car(make: "Audi", model: "S5", year: 2015))
store.add(car: Car(make: "BMW", model: "X3", year: 2016))
store.add(car: Car(make: "Honda", model: "Accord", year: 2018))

store.contains(make: "BMW") // -> true

推荐阅读