Saya memiliki array yang terdiri dari AnyObject
. Saya ingin mengulanginya, dan menemukan semua elemen yang merupakan instance array.
Bagaimana saya bisa memeriksa apakah suatu objek dari tipe tertentu di Swift?
swift
type-inference
typechecking
Encore PTL
sumber
sumber
Jawaban:
Jika Anda ingin memeriksa jenis tertentu, Anda dapat melakukan hal berikut:
Anda dapat menggunakan "sebagai!" dan itu akan menimbulkan kesalahan runtime jika
obj
bukan tipe[String]
Anda juga dapat memeriksa satu elemen sekaligus:
sumber
?
tidak ada. Kedengarannya sepertias
dan?
ketika digabungkan akan melakukan pemeriksaan runtime. Kapan akan tepat untuk digunakanas
tanpa?
? Terima kasih sebelumnya.as
tanpa?
jika tidak ada cara program Anda bisa pulih dari objek yang tidak seperti itu karena program akan segera berhenti jika tidak. Menggunakan?
dalamif
pernyataan memungkinkan program untuk melanjutkan.?
dalam hal ini akan melakukan pemeriksaan tipe "generik", jika ya, ke klausa if, jika tidak, ke klausa lain. Tanpa yang?
lain tidak akan pernah dimasukkan dan saat Anda menunjukkan menyebabkan kesalahan runtime. Terima kasih lagi.?
memungkinkan tugas untuk kembalinil
menyebabkan jika pernyataan untuk kembalifalse
dan karena itu jatuh melalui pernyataan lain. Namun, saya pikir penjelasan itu membantu dengan pemahaman, tetapiif let
sebenarnya adalah kasus khusus dalam kompilerDi Swift 2.2 - 5 sekarang Anda dapat melakukan:
Kemudian untuk memfilter array Anda:
Jika Anda memiliki beberapa jenis untuk diperiksa:
sumber
object
sebagaiString
di dalam kawat gigi (setidaknya di Swift 2), sedangkan denganlet
solusi Anda bisa melakukannya.object
di blok tidak masalah.object.uppercaseString
karena jenis variabel tidak dicor ke jenis itu, Anda hanya memeriksa bahwa objek (ditunjukkan oleh variabel) adalahString
Jika Anda hanya ingin tahu apakah suatu objek merupakan subtipe dari jenis yang diberikan maka ada pendekatan yang lebih sederhana:
“Gunakan operator pengecekan tipe untuk memeriksa apakah instance dari tipe subclass tertentu. Operator pemeriksa tipe mengembalikan true jika turunannya dari jenis subclass dan false jika tidak. " Kutipan dari: Apple Inc. “Bahasa Pemrograman Swift.” iBooks .
Dalam kalimat di atas frasa 'dari jenis subclass tertentu' adalah penting. Penggunaan
is Circle
danis Rectangle
diterima oleh kompiler karena nilaishape
tersebut dinyatakan sebagaiShape
(superclass dariCircle
danRectangle
).Jika Anda menggunakan tipe primitif, superclass akan menjadi
Any
. Berikut ini sebuah contoh:sumber
is
masih akan berfungsi di sini? Terima kasih.object
sebagaiAny
. Diperbarui dengan sebuah contoh.AnyObject
disarankan, tampaknya telah dibalas karenaAnyObject
tidak diwarisi dariNSObject
. JikaAny
berbeda, maka ini sebenarnya akan menjadi solusi yang bagus juga. Terima kasih.Saya punya 2 cara untuk melakukannya:
Atau:
Ini adalah contoh terperinci:
Edit: 3 sekarang:
sumber
isKindOfClass
adalah metodeNSObject
protokol; seharusnya hanya berfungsi untuk kelas yang mengadopsinya (semua kelas turun dari NSObject, ditambah kelas Swift khusus yang mengadopsinya secara eksplisit)untuk swift4:
sumber
Asumsikan drawTriangle adalah turunan dari UIView. Untuk memeriksa apakah drawTriangle bertipe UITableView:
Dalam Swift 3 ,
Ini juga dapat digunakan untuk kelas yang Anda tentukan sendiri. Anda bisa menggunakan ini untuk memeriksa subview tampilan.
sumber
Mengapa tidak menggunakan fungsionalitas bawaan yang dibangun khusus untuk tugas ini?
sumber
Diperingatkan tentang ini:
Semua empat baris terakhir mengembalikan true, ini karena jika Anda mengetik
... itu mencetak "false" tentu saja, tetapi Peringatan mengatakan bahwa Cast dari CGRect ke String gagal. Jadi, beberapa jenis dijembatani, dan kata kunci 'is' memanggil pemeran implisit.
Anda sebaiknya menggunakan salah satu dari ini:
sumber
Jika Anda hanya ingin memeriksa kelas tanpa mendapat peringatan karena nilai yang didefinisikan tidak digunakan (biarkan someVariable ...), Anda dapat dengan mudah mengganti barang yang dibiarkan dengan boolean:
Xcode mengusulkan ini ketika saya menggunakan cara membiarkan dan tidak menggunakan nilai yang ditentukan.
sumber
Mengapa tidak menggunakan sesuatu seperti ini
dalam Swift 3.
sumber
Swift 4.2, Dalam kasus saya, menggunakan fungsi isKind.
Readmore https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
sumber
myObject as? String
kembalinil
jikamyObject
bukanString
. Jika tidak, ia mengembalikan aString?
, sehingga Anda dapat mengakses string itu sendirimyObject!
, atau melemparkannya denganmyObject! as String
aman.sumber
Swift 3:
sumber
Hanya demi kelengkapan berdasarkan jawaban yang diterima dan beberapa lainnya:
Tetapi Anda juga bisa (
compactMap
juga "memetakan" nilai-nilai yangfilter
tidak):Dan versi menggunakan
switch
:Tetapi berpegang pada pertanyaan, untuk memeriksa apakah itu array (yaitu
[String]
):Atau lebih umum (lihat jawaban pertanyaan lain ini ):
sumber
as?
tidak akan selalu memberikan hasil yang diharapkan karenaas
tidak uji apakah tipe data adalah dari jenis tertentu tetapi hanya jika tipe data dapat dikonversi ke atau direpresentasikan sebagai jenis tertentu.Pertimbangkan kode ini misalnya:
Setiap tipe data yang sesuai dengan
Error
protokol dapat dikonversi keNSError
objek, jadi ini akan selalu berhasil . Namun itu tidak berarti bahwaerror
pada kenyataannyaNSError
objek atau subkelas dari itu.Jenis cek yang benar adalah:
Namun, ini hanya memeriksa untuk jenis yang tepat. Jika Anda ingin juga menyertakan subkelas dari
NSError
, Anda harus menggunakan:sumber
Jika Anda Memiliki Respons Seperti Ini:
dan Anda ingin memeriksa nilai
is_stucked
yang akan dibaca sebagai AnyObject, yang harus Anda lakukan adalah inisumber
Jika Anda tidak tahu bahwa Anda akan mendapatkan array kamus atau kamus tunggal dalam respons dari server, Anda perlu memeriksa apakah hasilnya berisi array atau tidak.
Dalam kasus saya selalu menerima array kamus kecuali sekali. Jadi, untuk mengatasinya saya menggunakan kode di bawah ini untuk swift 3.
Di sini sebagai? Array memeriksa apakah nilai yang diperoleh adalah array (dari item kamus). Dalam kasus lain, Anda dapat menangani jika item kamus tunggal yang tidak disimpan di dalam array.
sumber
Versi Swift 5.2 & Xcode: 11.3.1 (11C504)
Inilah solusi saya untuk memeriksa tipe data:
Saya harap ini akan membantu Anda.
sumber