Swift:确定自定义对象数组是否包含特定字符串
Swift: Determine if a array of custom objects contains a particular string
我有一个名为 carArray 的数组,它是一个 Cars 数组。
如何编写函数来确定数组是否包含特定模型?例如,如果用户输入“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))
添加这样的东西
func contains(make: String) -> Bool {
carArray.compactMap(\.make).contains(make)
} // returns true in your case for "BMW"
这有两部分。首先,我通过映射 make 键路径将 Car 对象数组映射到 String?
数组。由于这可能有 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([=11=]) } // 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
您可以使用 contains(where:)
函数来执行此操作:
carArray.contains(where: { [=10=].make == "BMW" })
https://developer.apple.com/documentation/swift/array/2297359-contains
编辑:抱歉错过了您的其他部分。如果你想避免每次都遍历数组,那么你必须存储一个额外的数据结构,比如每个 make
.
的 Set
我有一个名为 carArray 的数组,它是一个 Cars 数组。
如何编写函数来确定数组是否包含特定模型?例如,如果用户输入“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))
添加这样的东西
func contains(make: String) -> Bool {
carArray.compactMap(\.make).contains(make)
} // returns true in your case for "BMW"
这有两部分。首先,我通过映射 make 键路径将 Car 对象数组映射到 String?
数组。由于这可能有 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([=11=]) } // 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
您可以使用 contains(where:)
函数来执行此操作:
carArray.contains(where: { [=10=].make == "BMW" })
https://developer.apple.com/documentation/swift/array/2297359-contains
编辑:抱歉错过了您的其他部分。如果你想避免每次都遍历数组,那么你必须存储一个额外的数据结构,比如每个 make
.
Set