web-dev-qa-db-ja.com

要素が配列内にあるかどうかを調べる方法

Swiftでは、要素が配列に存在するかどうかをどうやって確認できますか? Xcodeでは、containincludehasについての提案はありません。また、この本を素早く検索しても何も得られません。これを確認する方法はありますか。私は、インデックス番号を返すメソッドfindがあることを知っていますが、Rubyの#include?のようなブール値を返すメソッドはありますか?

必要なものの例:

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

スイフト2、3、4:

let elements = [1, 2, 3, 4, 5]
if elements.contains(5) {
    print("yes")
}

contains()プロトコル拡張メソッド of SequenceTypeEquatable要素のシーケンス用)であり、以前のリリースのようなグローバルメソッドではありません。

備考:

Swiftの古いバージョン:

let elements = [1,2,3,4,5]
if contains(elements, 5) {
    println("yes")
}
773
Martin R

配列からオブジェクトを見つけて削除するためにここに来た人のために:

スイフト1

if let index = find(itemList, item) {
    itemList.removeAtIndex(index)
}

スイフト2

if let index = itemList.indexOf(item) {
    itemList.removeAtIndex(index)
}

スイフト3、4

if let index = itemList.index(of: item) {
    itemList.remove(at: index)
}
114
DogCoffee

この拡張子を使う:

extension Array {
    func contains<T where T : Equatable>(obj: T) -> Bool {
        return self.filter({$0 as? T == obj}).count > 0
    }
}

使用:

array.contains(1)

Swift 2/3用に更新

Swift 3(または2)では、グローバルcontains関数がArray上で一対の拡張メソッドになっているため、拡張は不要になりました。

let a = [ 1, 2, 3, 4 ]

a.contains(2)           // => true, only usable if Element : Equatable

a.contains { $0 < 1 }   // => false
57
David Berry

カスタムクラスまたはstruct のインスタンスが配列に含まれているかどうかを確認している場合は、.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)

Tip :==の上書きはあなたのクラスの/ struct内ではなく、グローバルレベルであるべきです

34

私はフィルターを使いました。

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
}
27
Jeffery Thomas

これを達成するための最も簡単な方法は、配列にフィルタを使用することです。

let result = elements.filter { $0==5 }

resultは、見つかった要素が存在すればそれを、存在しなければ空になります。そのため、resultが空かどうかをチェックするだけで、その要素が配列内に存在するかどうかがわかります。私は以下を使用します:

if result.isEmpty {
    // element does not exist in array
} else {
    // element exists
}
13
davetw12

Swift 2.1以降、NSArrayにはcontainsObjectというように使うことができます。

if myArray.containsObject(objectImCheckingFor){
    //myArray has the objectImCheckingFor
}
6
ColossalChris

万が一誰かがindexPathが選択されたものの中にあるかどうかを探そうとしているのです(UICollectionViewUITableViewcellForItemAtIndexPath関数のように):

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

これは私のデリゲート配列がデリゲートオブジェクトを含んでいるかどうかをチェックするために書いた私の小さな拡張です( 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
    }
}

このコードを最適化する方法がわかれば、私に知らせてください。

3
DevAndArtist

Swift 4、これを達成するためのもう1つの方法、フィルター機能付き

var要素= [1,2,3,4,5]

    if let object = elements.filter({ $0 == 5 }).first {
        print("found")
    } else {
        print("not found")
    }
3
Pramod More

ユーザーが特定の配列要素を見つけた場合は、整数値と同じ以下のコードを使用してください。

var arrelemnts = ["sachin", "test", "test1", "test3"]

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

迅速

オブジェクトを使用していない場合は、このコードを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")

 }
2
Anit Kumar

このように、ジョブにハッシュテーブルを使うのはどうでしょうか。

まず、「ハッシュマップ」ジェネリック関数を作成し、シーケンスプロトコルを拡張します。

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
1
James Rochabrun

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
}
0
Kiran Jasvanee

アレイ

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
0