编辑:问题已由@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}
,但没有尝试过。
答案 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 }
。