Swift:确定自定义对象数组是不是包含特定字符串[重复]
Posted
技术标签:
【中文标题】Swift:确定自定义对象数组是不是包含特定字符串[重复]【英文标题】:Swift: Determine if a array of custom objects contains a particular string [duplicate]Swift:确定自定义对象数组是否包含特定字符串[重复] 【发布时间】:2021-09-27 10:33:39 【问题描述】:我有一个名为 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))
【问题讨论】:
写循环有什么问题? 仅仅因为你使用了一个for循环并不意味着你必须遍历整个数组,你可以在匹配时使用break
或return
。在发布这样的问题时,您确实应该包含自己解决问题的尝试。
为什么所有结构成员都是可选的(并且是可变的)?这使得比较更加困难。
【参考方案1】:
添加类似的东西
func contains(make: String) -> Bool
carArray.compactMap(\.make).contains(make)
// returns true in your case for "BMW"
这有两个部分。首先,我通过映射生成键路径将 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($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
【讨论】:
为什么不像特雷弗的回答那样使用contains(where:)
?
@DuncanC 因为这是我首先编写的方式,我将其作为映射关键路径的示例。
感谢您的回答。在您的第一个函数contains(make: String)
中,我是否也可以拥有该函数,如果为真,则返回数组中使其为真的位置?谢谢
@Josh 不在我的示例中,因为它使用了一个集合。在您的原始代码中,您可以使用carArray.firstIndex $0.make == "BMW"
。这应该足以让你前进。【参考方案2】:
您可以使用contains(where:)
函数来执行此操作:
carArray.contains(where: $0.make == "BMW" )
https://developer.apple.com/documentation/swift/array/2297359-contains
编辑:抱歉错过了你的另一部分。如果您想避免每次都循环遍历数组,那么您必须存储一个额外的数据结构,例如每个 make
的 Set
。
【讨论】:
以上是关于Swift:确定自定义对象数组是不是包含特定字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章