Saya memiliki loop for-in ini:
for button in view.subviews {
}
Sekarang saya ingin tombol dilemparkan ke kelas kustom sehingga saya dapat menggunakan propertinya.
Saya mencoba ini: for button in view.subviews as AClass
Tapi itu tidak berhasil dan memberi saya kesalahan:'AClass' does not conform to protocol 'SequenceType'
Dan saya mencoba ini: for button:AClass in view.subviews
Tapi itu juga tidak berhasil.
for-loop
swift
for-in-loop
Arbitur
sumber
sumber
for button in view.subviews as [AClass]
Jawaban:
Untuk Swift 2 dan lebih baru:
Swift 2 menambahkan pola kasus ke for loop, yang membuatnya lebih mudah dan lebih aman untuk mengetik cast in a for loop:
Mengapa ini lebih baik daripada yang dapat Anda lakukan di Swift 1.2 dan sebelumnya? Karena pola case memungkinkan Anda untuk memilih tipe spesifik Anda dari koleksi. Ini hanya cocok dengan tipe yang Anda cari, jadi jika array Anda berisi campuran, Anda hanya dapat beroperasi pada tipe tertentu.
Sebagai contoh:
Keluaran:
Untuk Swift 1.2 :
Dalam kasus ini, Anda sedang mentransmisi
view.subviews
dan tidakbutton
, jadi Anda perlu menurunkannya ke array jenis yang Anda inginkan:Catatan: Jika tipe array yang mendasarinya tidak
[AClass]
, ini akan macet. Itulah yang dikatakan!
padaas!
Anda. Jika Anda tidak yakin tentang jenisnya, Anda dapat menggunakan cast bersyaratas?
bersama dengan binding opsionalif let
:Untuk Swift 1.1 dan sebelumnya:
Catatan: Ini juga akan macet jika subview tidak semuanya berjenis
AClass
. Metode aman yang tercantum di atas juga berfungsi dengan versi Swift sebelumnya.sumber
[ ]
tanda kurung persis seperti dalam contoh ini. Mungkin hanya saya tapi saya pikir itu hanya pilihan pemformatan dalam sampel kode pada awalnya :) Saya kira ini karena kita melakukan casting ke array.[Class]
terlihat jauh lebih baik daripadaArray<Class>
.Opsi ini lebih aman:
atau cara cepat:
sumber
Anda juga dapat menggunakan
where
klausasumber
button
inside body loop, yang merupakan tujuan dari solusi lainnya. Jadi ini hanya akan menjalankan badan perulangan pada elemenview.subviews
yangUIButton
s, tetapi tidak membantu, misalnya dalam memanggilAClass
metode -specific onbutton
.where
hanya penjaga dan tidak melemparkan.where
mungkin lebih elegan dan mudah dibaca untuk kasus (permainan kata tidak disengaja) di mana Anda hanya memerlukan pelindung boolean.Jawaban yang diberikan benar, saya hanya ingin menambahkan ini sebagai tambahan.
Saat menggunakan for loop dengan force casting, kode akan macet (seperti yang telah disebutkan oleh orang lain).
Namun alih-alih menggunakan klausa if,
cara lain adalah dengan menggunakan while-loop:
Yang tampaknya lebih nyaman jika beberapa elemen (tetapi tidak semua) dari array mungkin bertipe
AClass
.Meskipun untuk saat ini (pada Swift 5), saya akan menggunakan for-case loop:
sumber
Jawaban yang diberikan oleh vacawama benar di Swift 1.0. Dan tidak lagi berfungsi dengan Swift 2.0.
Jika Anda mencoba, Anda akan mendapatkan kesalahan yang mirip dengan:
Di Swift 2.0 Anda perlu menulis seperti:
sumber
Anda dapat melakukan transmisi dan aman pada saat yang sama dengan ini:
sumber