【问题标题】:How to check if an object is in array如何检查对象是否在数组中
【发布时间】:2017-06-22 13:36:14
【问题描述】:

编辑:@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},但都没有工作。

【问题讨论】:

标签: arrays swift random contains


【解决方案1】:

您不能那样使用contains,因为您的类不符合Equatable 协议。

:Equatable 添加到您的类定义中并实现比较两个对象的== 函数:

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 } 不起作用,因为它只测试对象是否相同实例。在您的情况下,您需要检查两个对象是否具有相同的属性,如果它们是相同的实例,您不感兴趣。您创建对象的方式永远不会创建已经在数组中的实例,因此此检查将始终返回 false

【讨论】:

  • 感谢您快速且易于理解的回复。效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多