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循环并不意味着你必须遍历整个数组,你可以在匹配时使用breakreturn。在发布这样的问题时,您确实应该包含自己解决问题的尝试。 为什么所有结构成员都是可选的(并且是可变的)?这使得比较更加困难。 【参考方案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

编辑:抱歉错过了你的另一部分。如果您想避免每次都循环遍历数组,那么您必须存储一个额外的数据结构,例如每个 makeSet

【讨论】:

以上是关于Swift:确定自定义对象数组是不是包含特定字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

touchesBegan Swift 2 自定义 SpriteKit 节点

检查Swift数组是不是包含对象实例[重复]

检查 Swift 数组上的重复属性

从数组中删除自定义对象 (Swift)

Swift:具有特定类型的Any对象的过滤器数组

Swift 减少元组数组自定义数据模型