Saya mencoba mencari item index
dengan mencari a list
. Adakah yang tahu cara melakukannya?
Saya melihat ada list.StartIndex
dan list.EndIndex
tapi saya ingin sesuatu seperti ular sanca list.index("text")
.
Karena swift dalam beberapa hal lebih fungsional daripada berorientasi objek (dan Array adalah struct, bukan objek), gunakan fungsi "find" untuk beroperasi pada array, yang mengembalikan nilai opsional, jadi bersiaplah untuk menangani nilai nil:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Pembaruan untuk Swift 2.0:
Fungsi lama find
tidak didukung lagi dengan Swift 2.0!
Dengan Swift 2.0, Array
memperoleh kemampuan untuk menemukan indeks elemen menggunakan fungsi yang didefinisikan dalam ekstensi CollectionType
(yang Array
mengimplementasikan):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Selain itu, menemukan elemen pertama dalam array yang memenuhi predikat didukung oleh ekstensi lain dari CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
Perhatikan bahwa kedua fungsi ini mengembalikan nilai opsional, seperti yang find
dilakukan sebelumnya.
Pembaruan untuk Swift 3.0:
Perhatikan sintaks indexOf telah berubah. Untuk item yang sesuai dengan Equatable
Anda dapat menggunakan:
let indexOfA = arr.index(of: "a")
Dokumentasi terperinci dari metode ini dapat ditemukan di https://developer.apple.com/reference/swift/array/1689674-index
Untuk item array yang tidak sesuai dengan Equatable
Anda harus menggunakan index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Pembaruan untuk Swift 4.2:
Dengan Swift 4.2, index
tidak lagi digunakan tetapi dipisahkan menjadi firstIndex
dan lastIndex
untuk klarifikasi yang lebih baik. Jadi tergantung pada apakah Anda mencari indeks item pertama atau terakhir:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
array struct yang Anda tentukan sendiri, struct Anda harus mematuhiEquatable
protokol.tl; dr:
Untuk kelas, Anda mungkin mencari:
Jawaban lengkap:
Saya pikir perlu disebutkan bahwa dengan tipe referensi (
class
) Anda mungkin ingin melakukan perbandingan identitas , dalam hal ini Anda hanya perlu menggunakan===
operator identitas dalam penutupan predikat:Swift 5, Swift 4.2:
Perhatikan bahwa sintaks di atas menggunakan sintaks trailing closure, dan setara dengan:
Swift 4 / Swift 3 - fungsi yang dulu disebut
index
Swift 2 - fungsi yang dulu disebut
indexOf
* Catat komentar yang relevan dan berguna oleh paulbailey tentang
class
jenis yang diterapkanEquatable
, di mana Anda perlu mempertimbangkan apakah Anda harus membandingkan penggunaan===
( operator identitas ) atau==
( operator kesetaraan ). Jika Anda memutuskan untuk mencocokkan menggunakan==
, maka Anda cukup menggunakan metode yang disarankan oleh orang lain (people.firstIndex(of: person1)
).sumber
Person
menerapkanEquatable
protokol, ini tidak diperlukan.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
adalah struct saya ... ide?structs
(danenums
) adalah tipe nilai, bukan tipe referensi. Hanya tipe referensi (mis.class
) Yang memiliki logika perbandingan identitas (===
). Lihat jawaban lain untuk apa yang harus dilakukanstructs
(pada dasarnya Anda cukup menggunakanarray.index(of: myStruct)
, pastikan jenismyStruct
konformat keEquatable
(==
)).Anda bisa
filter
menggunakan array dengan penutup:Dan Anda dapat menghitung array:
Jadi, Anda dapat menentukan apakah array menyertakan elemen Anda dengan menggabungkan ini:
Jika Anda ingin menemukan posisi itu, saya tidak melihat cara yang mewah, tetapi Anda pasti bisa melakukannya seperti ini:
EDIT
Sementara kita melakukannya, untuk latihan yang menyenangkan, mari kita lanjutkan
Array
untuk memilikifind
metode:Sekarang kita bisa melakukan ini:
sumber
Array
untuk memilikifind
metode yang melakukan apa yang Anda inginkan. Saya belum tahu apakah ini praktik yang baik, tetapi ini adalah eksperimen yang rapi.enumerate
sehingga tidak berlaku lagi, tetapi Anda benar.Cepat 5
Contoh 1
Contoh2
sumber
Meskipun
indexOf()
bekerja dengan sempurna, itu hanya mengembalikan satu indeks.Saya mencari cara yang elegan untuk mendapatkan berbagai indeks untuk elemen yang memenuhi beberapa syarat.
Inilah cara melakukannya:
Swift 3:
Swift 2:
sumber
Untuk kelas khusus, Anda perlu menerapkan protokol Setara.
sumber
Pembaruan untuk Swift 2:
Cepat 1:
Jika Anda mencari hanya untuk memeriksa apakah suatu elemen terkandung di dalam array, yaitu, dapatkan indikator boolean, gunakan
contains(sequence, element)
alih-alihfind(array, element)
:Lihat contoh di bawah ini:
sumber
dalam Swift 4.2
.index (di mana :) diubah menjadi .firstIndex (di mana :)
sumber
Swift 4. Jika array Anda mengandung elemen tipe [String: AnyObject]. Jadi untuk menemukan indeks elemen gunakan kode di bawah ini
Atau Jika Anda ingin menemukan indeks berdasarkan kunci dari Kamus. Di sini array berisi Objects of Model class dan saya mencocokkan properti id.
sumber
Cepat 2.1
Cepat 3
sumber
let array
? Penggunaanself
dipertanyakan juga.Di Swift 4 , jika Anda melintasi array DataModel Anda, pastikan model data Anda sesuai dengan Protokol yang Dapat Diterapkan, mengimplementasikan metode lhs = rhs, dan hanya dengan demikian Anda dapat menggunakan ".index (of". Misalnya
Lalu,
sumber
Dalam Swift 2 (dengan Xcode 7),
Array
sertakanindexOf
metode yang disediakan olehCollectionType
protokol. (Sebenarnya, duaindexOf
metode — satu yang menggunakan persamaan untuk mencocokkan suatu argumen, dan yang lainnya menggunakan penutupan).Sebelum Swift 2, tidak ada cara untuk jenis generik seperti koleksi untuk menyediakan metode untuk jenis beton yang berasal dari mereka (seperti array). Jadi, di Swift 1.x, "indeks" adalah fungsi global ... Dan namanya juga diganti, jadi di Swift 1.x, fungsi global itu disebut
find
.Mungkin juga (tetapi tidak perlu) menggunakan
indexOfObject
metode ini dariNSArray
... atau metode pencarian lain yang lebih canggih dari Foundation yang tidak memiliki padanan dalam pustaka standar Swift. Hanyaimport Foundation
(atau modul lain yang mengimpor Yayasan secara transitif), sampaikanArray
keNSArray
, dan Anda dapat menggunakan banyak metode pencarianNSArray
.sumber
Salah satu solusi ini bekerja untuk saya
Ini solusi yang saya miliki untuk Swift 4:
sumber
Anda juga dapat menggunakan dolar perpustakaan fungsional untuk melakukan indexOf pada array seperti http://www.dollarswift.org/#indexof-indexof
sumber
Jika Anda masih bekerja di Swift 1.x
lalu coba,
sumber
Untuk SWIFT 3 Anda dapat menggunakan fungsi sederhana
Ini akan memberikan posisi angka, sehingga Anda dapat menggunakan suka
Semoga bermanfaat
sumber
SWIFT 4
Katakanlah Anda ingin menyimpan nomor dari array bernama cardButtons ke cardNumber, Anda dapat melakukannya dengan cara ini:
pengirim adalah nama tombol Anda
sumber
Cepat 4
Untuk jenis referensi:
sumber
Di Swift 4/5, gunakan "firstIndex" untuk menemukan indeks.
sumber
Jika seseorang memiliki masalah ini
hanya lakukan ini
kemudian
sumber
Untuk
(>= swift 4.0)
Ini agak sangat sederhana. Pertimbangkan
Array
objek berikut .Untuk mendapatkan indeks elemen
rose
, yang harus Anda lakukan adalah:catatan:
Array.index(of:)
mengembalikan sebuahOptional<Int>
.nil
menyiratkan bahwa elemen tidak ada dalam array.Anda mungkin ingin membuka paksa nilai yang dikembalikan atau menggunakan
if-let
untuk menyiasati opsional.sumber
Cukup gunakan metode firstIndex.
sumber