如何检查一个元素是否在数组中

567
在Swift中,我如何检查一个元素是否存在于数组中?Xcode没有任何关于containincludehas的建议,在书中快速搜索也没有结果。有什么想法可以检查这个吗?我知道有一个方法find可以返回索引号,但是否有像Ruby的#include?那样返回布尔值的方法?

我需要的示例:

var elements = [1,2,3,4,5]
if elements.contains(5) {
  //do something
}

11
if find(elements, 5) != nil { } 不够好吗? (备注:该行代码的意思为如果在数组"elements"中找到值为5的元素,则执行大括号内的代码。) - Martin R
1
我本来希望有更简洁的解决方案,但现在看起来不太乐观。我还没有在文档或书籍中找到任何相关内容。 - jaredsmith
18个回答

6

数组

let elements = [1, 2, 3, 4, 5, 5]

检查元素是否存在

elements.contains(5) // true

获取元素索引

elements.firstIndex(of: 5) // 4
elements.firstIndex(of: 10) // nil

获取元素数量

let results = elements.filter { element in element == 5 }
results.count // 2

3

如果有人想要查找一个indexPath是否在选中的列表中(例如在UICollectionViewUITableViewcellForItemAtIndexPath函数中),请注意以下内容:

    var isSelectedItem = false
    if let selectedIndexPaths = collectionView.indexPathsForSelectedItems() as? [NSIndexPath]{
        if contains(selectedIndexPaths, indexPath) {
            isSelectedItem = true
        }
    }

2
如果用户发现特定的数组元素,则使用以下代码,与整数值相同。
var arrelemnts = ["sachin", "test", "test1", "test3"]

 if arrelemnts.contains("test"){
    print("found")   }else{
    print("not found")   }

2

这是我刚写的小扩展,用于检查我的委托数组是否包含委托对象 (适用于Swift 2)。 :) 它还可以很好地处理值类型。

extension Array
{
    func containsObject(object: Any) -> Bool
    {
        if let anObject: AnyObject = object as? AnyObject
        {
            for obj in self
            {
                if let anObj: AnyObject = obj as? AnyObject
                {
                    if anObj === anObject { return true }
                }
            }
        }
        return false
    }
}

如果您有优化此代码的想法,请告诉我。

2
您可以这样添加一个Array扩展:
extension Array {
     func contains<T>(_ object: T) -> Bool where T: Equatable {
         !self.filter {$0 as? T == object }.isEmpty
     }
 }

这可以用作:

这可以用作:

if myArray.contains(myItem) {
   // code here
}

1

你觉得使用哈希表来完成这个任务怎么样?像这样:

首先,创建一个“哈希映射”通用函数,扩展序列协议。

extension Sequence where Element: Hashable {

    func hashMap() -> [Element: Int] {
        var dict: [Element: Int] = [:]
        for (i, value) in self.enumerated() {
            dict[value] = i
        }
        return dict
    }
}

只要数组中的项符合可哈希的要求,比如整数或字符串,这个扩展就可以工作。以下是用法...

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

1

Swift

如果您不使用对象,则可以使用此代码进行包含。

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 }

如果你想要任何对象类型。
{ "\($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")

 }

1

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接