【问题标题】: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。在发布这样的问题时,您确实应该包含自己解决问题的尝试。
  • 为什么所有结构成员都是可选的(并且是可变的)?这使得比较更加困难。

标签: arrays swift search contains


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多