当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《检查自定义对象数组是否包含特定的自定义对象》经验,为你挑选了2个好方法。

说我有一个非常简单的Person课程

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

并且我希望将这样的Persons 的集合存储在属性中,该属性是Person类的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'"



1> GoZoner..:

有两个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或身份).



2> Martin R..:

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

class Person是一种引用类型,var alex是对象存储的引用.的相同,以操作者=== 检查是否两个常量或变量指一类的相同的实例.

因此,为了检查列表是否包含 特定实例,请使用基于谓词的contains() 方法,并将实例与===以下内容进行比较 :

if people.list.contains({ $0 === alex }) {
    // ...
}


@BhavinRamani:使用`index(where:{$ 0 === alex})`
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有