gpt4 book ai didi

ios - Swift iOS - 按属性比较 1 个数组中的元素

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:22 25 4
gpt4 key购买 nike

我有一个对象数组,我想根据属性比较这些对象,看看属性是否完全相同。现在我遍历所有对象,将属性的所有值放在一个单独的数组中,然后使用 filterArr.allSatisfy { $0 == filterArr.last } 来确定属性是否相同或不。

此方法有效,但我知道必须有比我正在做的更优雅的方法。

我实际上一直在寻找这个问题的答案,但我遇到的每一件事都是比较 2 个不同数组而不是 1 个数组的元素。

class IceCream {
var flavor: String?
var price: Double?
}

let iceCream1 = IceCream()
iceCream1.flavor = "vanilla"
iceCream1.price = 1.5

let iceCream2 = IceCream()
iceCream2.flavor = "chocolate"
iceCream2.price = 2.0

let iceCream3 = IceCream()
iceCream3.flavor = "vanilla"
iceCream3.price = 1.5

let iceCream4 = IceCream()
iceCream4.flavor = "strawberry"
iceCream4.price = 2.5

let iceCreams = [iceCream1, iceCream2, iceCream3, iceCream4]

var filterArr = [String]()

for iceCream in iceCreams {
filterArr.append(iceCream.flavor ?? "")
}

let areItemsEqual = filterArr.allSatisfy { $0 == filterArr.last }

print(areItemsEqual) // prints false

最佳答案

您可以避免使用结构在单独的行上初始化然后分配属性。

struct IceCream {
let flavor: String?
let price: Double?
}

let iceCreams: [IceCream] = [
IceCream(flavor: "vanilla", price: 1.5),
IceCream(flavor: "chocolate", price: 2.0),
IceCream(flavor: "vanilla", price: 1.5),
IceCream(flavor: "strawberry", price: 2.5)
]

使用 @Alexander 提供的通用糖和 @matt ,我们有一个漂亮的扩展。

extension Collection {
func allEqual<T: Equatable>(by key: KeyPath<Element, T>) -> Bool {
return allSatisfy { first?[keyPath:key] == $0[keyPath:key] }
}
}

print(iceCreams.allEqual(by: \.flavor))

或者,您可以指定一个 IceCream 的口味相同。

extension IceCream: Equatable {
static func == (lhs: IceCream, rhs: IceCream) -> Bool {
return lhs.flavor == rhs.flavor
}
}

extension Collection where Element: Equatable {
func allEqual() -> Bool {
return allSatisfy { first == $0 }
}
}

print(iceCreams.allEqual())

关于ios - Swift iOS - 按属性比较 1 个数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53974239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com