Checking if an array of custom objects contain a specific custom object

前端 未结 2 1646
春和景丽
春和景丽 2020-12-03 09:47

say i have a very simple Person class

class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
}
2条回答
  •  情书的邮戳
    2020-12-03 10:42

    There are two contains functions:

    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
    }
    

    The compiler is complaining because the compiler knows that Person is not Equatable and thus contains needs to have a predicate but alex is not a predicate.

    If the people in your array are Equatable (they aren't) then you could use:

    person.list.contains(alex)
    

    Since they aren't equatable, you could use the second contains function with:

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

    or, as Martin R points out, based on 'identity' with:

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

    or you could make Person be Equatable (based on either name or identity).

提交回复
热议问题