检查自定义对象数组是否包含特定的自定义对象

发布于 2021-01-31 23:45:29

说我的Person课很简单

class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
}

我希望将此类Persons 的集合存储在People类的属性中,该属性是类型为Person的数组

class People {
    var list:[Person] = []
}

也许我做到这一点如下

var alex = Person(name:"Alex")
var people = People()
people.list.append(alex)

问题:请问我如何检查people.list是否包含实例alex?

我很想尝试的简单尝试 true

people.list.contains(alex)

称一个错误 "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"

关注者
0
被浏览
116
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    有两个contains功能:

    extension SequenceType where Generator.Element : Equatable {
        /// Return `true` iff `element` is in `self`.
        @warn_unused_result
        public func contains(element: Self.Generator.Element) -> Bool
    }
    
    extension SequenceType {
        /// Return `true` iff an element in `self` satisfies `predicate`.
        @warn_unused_result
        public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
    }
    

    编译器在抱怨是因为编译器知道Person不是Equatable,因此contains需要一个谓词,predicatealex不是谓词。

    如果阵列中的人员是Equatable(不是),则可以使用:

    person.list.contains(alex)
    

    由于它们不相等,因此可以将第二个contains函数与以下函数一起使用:

    person.list.contains { $0.name == alex.name }
    

    或正如Martin R所指出的,基于“身份”:

    person.list.contains { $0 === alex }
    

    或者您可以将Person其设为Equatable(基于name或身份)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看