Swiftでは、要素が配列に存在するかどうかをどうやって確認できますか? Xcodeでは、contain
、include
、has
についての提案はありません。また、この本を素早く検索しても何も得られません。これを確認する方法はありますか。私は、インデックス番号を返すメソッドfind
があることを知っていますが、Rubyの#include?
のようなブール値を返すメソッドはありますか?
必要なものの例:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
スイフト2、3、4:
let elements = [1, 2, 3, 4, 5]
if elements.contains(5) {
print("yes")
}
contains()
はプロトコル拡張メソッド of SequenceType
(Equatable
要素のシーケンス用)であり、以前のリリースのようなグローバルメソッドではありません。
備考:
contains()
メソッドはシーケンス要素がEquatable
プロトコルを採用することを要求します。 Andrewsの答え 。NSObject
サブクラスのインスタンスである場合は、isEqual:
をオーバーライドする必要があります。Swiftの NSObjectサブクラス:hash vs hashValue、isEqual vs == を参照してください。contains()
メソッドがあります。 オブジェクトがSwiftの配列に存在するかどうかをテストするための速記? 。Swiftの古いバージョン:
let elements = [1,2,3,4,5]
if contains(elements, 5) {
println("yes")
}
配列からオブジェクトを見つけて削除するためにここに来た人のために:
スイフト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)
}
この拡張子を使う:
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
カスタムクラスまたは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内ではなく、グローバルレベルであるべきです
私はフィルターを使いました。
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
}
これを達成するための最も簡単な方法は、配列にフィルタを使用することです。
let result = elements.filter { $0==5 }
result
は、見つかった要素が存在すればそれを、存在しなければ空になります。そのため、result
が空かどうかをチェックするだけで、その要素が配列内に存在するかどうかがわかります。私は以下を使用します:
if result.isEmpty {
// element does not exist in array
} else {
// element exists
}
Swift 2.1以降、NSArrayにはcontainsObject
というように使うことができます。
if myArray.containsObject(objectImCheckingFor){
//myArray has the objectImCheckingFor
}
万が一誰かがindexPath
が選択されたものの中にあるかどうかを探そうとしているのです(UICollectionView
やUITableView
cellForItemAtIndexPath
関数のように):
var isSelectedItem = false
if let selectedIndexPaths = collectionView.indexPathsForSelectedItems() as? [NSIndexPath]{
if contains(selectedIndexPaths, indexPath) {
isSelectedItem = true
}
}
これは私のデリゲート配列がデリゲートオブジェクトを含んでいるかどうかをチェックするために書いた私の小さな拡張です( 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
}
}
このコードを最適化する方法がわかれば、私に知らせてください。
Swift 4、これを達成するためのもう1つの方法、フィルター機能付き
var要素= [1,2,3,4,5]
if let object = elements.filter({ $0 == 5 }).first {
print("found")
} else {
print("not found")
}
ユーザーが特定の配列要素を見つけた場合は、整数値と同じ以下のコードを使用してください。
var arrelemnts = ["sachin", "test", "test1", "test3"]
if arrelemnts.contains("test"){
print("found") }else{
print("not found") }
迅速
オブジェクトを使用していない場合は、このコードを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")
}
このように、ジョブにハッシュテーブルを使うのはどうでしょうか。
まず、「ハッシュマップ」ジェネリック関数を作成し、シーケンスプロトコルを拡張します。
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
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 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