在Swift中,我如何检查数组中是否存在一个元素?Xcode并没有给出包含、包含或拥有的建议,快速搜索这本书也一无所获。知道怎么检查这个吗?我知道有一个方法找到返回索引号,但是否有一个方法返回一个布尔像ruby的#include??
我需要的例子:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
在Swift中,我如何检查数组中是否存在一个元素?Xcode并没有给出包含、包含或拥有的建议,快速搜索这本书也一无所获。知道怎么检查这个吗?我知道有一个方法找到返回索引号,但是否有一个方法返回一个布尔像ruby的#include??
我需要的例子:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
当前回答
如果您正在检查一个自定义类或结构的实例是否包含在数组中,那么在使用.contains(myObject)之前,您需要实现Equatable协议。
例如:
struct Cup: Equatable {
let filled:Bool
}
static func ==(lhs:Cup, rhs:Cup) -> Bool { // Implement Equatable
return lhs.filled == rhs.filled
}
然后你可以这样做:
cupArray.contains(myCup)
提示:==重写应该在全局级别,而不是在类/结构中
其他回答
对于那些来这里寻找从数组中查找并移除对象的人:
斯威夫特1
if let index = find(itemList, item) {
itemList.removeAtIndex(index)
}
斯威夫特2
if let index = itemList.indexOf(item) {
itemList.removeAtIndex(index)
}
Swift 3,4
if let index = itemList.index(of: item) {
itemList.remove(at: index)
}
斯威夫特5.2
if let index = itemList.firstIndex(of: item) {
itemList.remove(at: index)
}
Swift 4.2 + 通过下面的函数,可以很容易地验证实例是否是数组。
func verifyIsObjectOfAnArray<T>(_ object: T) -> Bool {
if let _ = object as? [T] {
return true
}
return false
}
甚至你也可以像下面这样访问它。如果对象不是数组,你将收到nil。
func verifyIsObjectOfAnArray<T>(_ object: T) -> [T]? {
if let array = object as? [T] {
return array
}
return nil
}
我用滤镜。
let results = elements.filter { el in el == 5 }
if results.count > 0 {
// any matching items are in results
} else {
// not found
}
如果你愿意,你可以把它压缩成
if elements.filter({ el in el == 5 }).count > 0 {
}
希望这能有所帮助。
Swift 2更新
为默认实现欢呼!
if elements.contains(5) {
// any matching items are in results
} else {
// not found
}
像这样使用哈希表如何?
首先,创建一个“哈希映射”泛型函数,扩展Sequence协议。
extension Sequence where Element: Hashable {
func hashMap() -> [Element: Int] {
var dict: [Element: Int] = [:]
for (i, value) in self.enumerated() {
dict[value] = i
}
return dict
}
}
这个扩展将工作,只要数组中的项目符合Hashable,像整数或字符串,这里是用法…
let numbers = Array(0...50)
let hashMappedNumbers = numbers.hashMap()
let numToDetect = 35
let indexOfnumToDetect = hashMappedNumbers[numToDetect] // returns the index of the item and if all the elements in the array are different, it will work to get the index of the object!
print(indexOfnumToDetect) // prints 35
但现在,我们只检查元素是否在数组中。
let numExists = indexOfnumToDetect != nil // if the key does not exist
means the number is not contained in the collection.
print(numExists) // prints true
斯威夫特
如果你不使用object,那么你可以使用此代码用于contains。
let elements = [ 10, 20, 30, 40, 50]
if elements.contains(50) {
print("true")
}
如果你在swift中使用NSObject类。这个变量符合我的要求。您可以根据自己的需求进行修改。
var cliectScreenList = [ATModelLeadInfo]()
var cliectScreenSelectedObject: ATModelLeadInfo!
这是针对相同的数据类型。
{ $0.user_id == cliectScreenSelectedObject.user_id }
如果你想要AnyObject类型。
{ "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" }
已满的状况
if cliectScreenSelected.contains( { $0.user_id == cliectScreenSelectedObject.user_id } ) == false {
cliectScreenSelected.append(cliectScreenSelectedObject)
print("Object Added")
} else {
print("Object already exists")
}