我有对象数组,其中包含具有字符串值的属性。我想要的是,返回一个Bool值,指示数组是否包含不少于2个对象:-一个对象的字符串属性值等于"foo"-一个对象的字符串属性值等于"bar">
到目前为止,我只能用"丑陋"的方法来解决这个问题:
!myArr.filter{ $0.property == "foo"}.isEmpty &&
!myArr.filter{ $0.property == "bar"}.isEmpty
有更好的方法吗?
以下是Playground中使用该方法的简单代码:
struct Obj {
var foo: String
}
let arr = [Obj(foo: "foo"), Obj(foo: "bar"), Obj(foo: "zoo")]
let result = !arr.filter{ $0.foo == "foo"}.isEmpty && !arr.filter{ $0.foo == "bar"}.isEmpty
print(result)
(["foo", "bar"] as Set).isSubset( of: myArr.map(.property) )
(["foo", "bar"] as Set).isSubset( of: arr.map(.foo) )
@Larme是对的,如果考虑时间复杂性,filter
的最坏/最佳情况是O(n(,而使用contains
或first
可以小于O(n(,甚至O(1(
因此,对于这种情况,最好的选择是:
myArr.contains(where: {$0.propery == "foo"}) && myArr.contains(where: {$0.propery == "bar"})
或
((myArr.first(where: {$0.propery == "foo"}) != nil) && (myArr.first(where: {$0.propery == "bar"}) != nil)