如何检查对象是否在数组中

时间:2017-02-05 15:27:06

标签: arrays swift random contains

编辑:问题已由@vacawama解决。但是,如果您正在寻找NSObject classes的答案,则应实施isEqual NSObjectProtocol函数。否则你会收到一个错误:“Redundant conformance of 'classname' to protocol 'Equatable'

您可以查看详情:Swift 2.2, Contains Method not working

在swift中,如何检查对象是否在数组中?

我有一个像这样的简单课程;

class Test: {
    private var _number: Int!
    private var _type: String!

    var number: Int {
            return _number
    }
    var type: String {
            return _type
    }

    init (number: Int, type: String) {
        self._number = number
        self._type = type
    }
}

我也有这门课;

class TestRandom {

    private let _numberArr: [Int] = [1,2,3,4,5,6,7,8,9,10]
    private let _typeArr: [String] = ["x","y","z"]
    public private(set) var _testArr: [Test] = []
    private var _randomTest: Test!

    func randomTestPicker () {
            repeat {

                    let randomNumber = Int(arc4random_uniform(UInt32(self._numberArr.count)))
                    let randomType = Int(arc4random_uniform(UInt32(self._typeArr.count)))

                    self._randomTest = Test(number: self._numberArr[randomNumber], type: self._typeArr[randomType])
            } while self._testArr.contains(_randomTest) 
    }
}

我想做的就是选择不同的对象。假设我在_testArr中有x2,y4,x6,z3,z8,y2。当我调用randomTestPicker时,它不应该选择x2或z8。因为它们已经在阵列中了。

我试过包含你看到的内容。但它对我不起作用。有什么解决方案可以用于此目的吗?或者最好的方法是什么?

编辑:我尝试了self._testArr.contains{$0 === _randomTest},但没有尝试过。

1 个答案:

答案 0 :(得分:3)

由于您的课程不符合xml协议,因此您无法使用contains

Equatable添加到您的班级定义中,并实施比较两个对象的:Equatable函数:

==

另一种方法是使用contains的谓词形式。谓词接受两个对象并返回class Test: Equatable { private var _number: Int! private var _type: String! var number: Int { return _number } var type: String { return _type } init (number: Int, type: String) { self._number = number self._type = type } } func ==(lhs: Test, rhs: Test) -> Bool { return lhs.number == rhs.number && lhs.type == rhs.type } ,表示它们是否匹配。在这种情况下,你会写:

Bool

正如您所看到的,在这种情况下,闭包基本上是上面的self._testArr.contains { $0.number == _randomTest.number && $0.type == _randomTest.type } 函数,因此实现==协议是更简洁的方法。

闭包Equatable不起作用,因为它只测试对象是否是相同的实例。在您的情况下,您需要检查两个对象是否具有相同的属性,如果它们是同一个实例,您不感兴趣。您创建对象的方式永远不会创建已存在于数组中的实例,因此此检查将始终返回{ $0 === _randomTest }