Cukup lama di proyek saya ketika menulis ketika saya menggunakan tipe
Apa saja , misalnya, saat memproses data JSON. Tetapi saya juga tahu bahwa ada tipe kedua -
AnyObject . Dan baru-baru ini, saya telah memikirkan perbedaan antara kedua tipe ini.
Menurut dokumentasi Apple:
- Any - dapat mewakili instance dari jenis apa pun
- AnyObject - dapat mewakili turunan dari kelas apa pun
Untuk membuatnya lebih mudah, maka:
- Apa pun digunakan untuk semua jenis.
- AnyObject - digunakan untuk tipe Class
Mari kita verifikasi dalam praktik kedua jenis ini. Mari kita mulai dengan mengetikkan
Any .
Untuk melakukan ini, buat array tipe Any, dan cetaklah.
let anyArray: [Any] = ["Macbook", 1, 2] print(anyArray) Console: ["Macbook", 1, 2]
Seperti yang dapat kita lihat, Apa pun memungkinkan Anda untuk bekerja dengan berbagai jenis data pada saat yang sama (String, Int).
Menurut dokumentasi, elemen (
String dan
Int ) dalam array ini adalah struktur yang merupakan tipe nilai, oleh karena itu, secara teoritis,
AnyObject seharusnya tidak berfungsi.
Untuk memverifikasi ini, buat array identik jenis
AnyObject .
let anyObjectArray: [AnyObject] = ["Macbook", 1, 2]
Seperti yang diharapkan, kompiler memberi kita kesalahan tentang ketidakmungkinan mengkonversi tipe "String / Int" ke tipe
AnyObjectKesalahan kompilerTidak dapat mengonversi nilai tipe "Int" ke tipe elemen yang diharapkan "AnyObject"
Tidak dapat mengonversi nilai tipe "Int" ke tipe elemen yang diharapkan "AnyObject"
Tidak dapat mengonversi nilai dari tipe "String" ke tipe elemen yang diharapkan "AnyObject"
Tapi mari kita coba membawa ketiga jenis kami ke AnyObject dan cetak hasilnya.
let anyObjectArray: [AnyObject] = ["Macbook" as AnyObject, 1 as AnyObject, 2 as AnyObject] print(anyObjectArray) Console: [Macbook, 1, 2]
Kesalahan kompiler telah hilang. Seperti yang bisa kita lihat, string
Macbook jelas terlihat seperti string, tetapi tidak memiliki tanda kutip seperti tipe
String di Swift.
Mari kita coba mencetak array menggunakan loop untuk memeriksa tipe aktualnya.
for item in anyObjectArray { if item is String { print("\(item) String") } else if item is Int { print("\(item) Int") } } Console: Macbook String 1 Int 2 Int
Sebuah string adalah tipe String. Seperti yang dikatakan sebelumnya, string dalam Swift adalah struktur, bukan tipe kelas. Karena itu, kita seharusnya tidak dapat menggunakannya sebagai AnyObject.
Mari kita lakukan beberapa percobaan lagi dengan array kami. Mari kita coba untuk memeriksanya untuk tipe dari Objective - C:
NSString dan
NSNumber .
for item in anyObjectArray { if item is NSString { print("\(item) NSString") } else if item is NSNumber { print("\(item) NSNumber") } } Console: Macbook NSString 1 NSNumber 2 NSNumber
Jadi mengapa ini terjadi?
Sebagai bagian dari kompatibilitasnya dengan Objective - C, Swift menawarkan cara yang nyaman dan efisien untuk bekerja dengan platform Cocoa.
Swift akan secara otomatis mengonversi beberapa tipe Objective - C ke tipe Swift, dan beberapa tipe Swift ke tipe Objective - C. Jenis yang dapat dikonversi antara Objective - C dan Swift disebut
concatenated .
Dengan kata lain, kompiler melakukan segala yang mungkin untuk fleksibel dalam menangani tipe-tipe ini dengan secara otomatis mengkonversi dan membuat "jembatan", sementara pada saat yang sama mencegah crash aplikasi.
Kapan menggunakan AnyObject?
Seperti yang dinyatakan dalam dokumentasi Apple, AnyObject dapat digunakan untuk bekerja dengan objek yang
berasal dari Kelas , tetapi tidak memiliki kelas root yang sama.
Dalam Swift 3, tipe id di Objective - C sekarang dipetakan ke tipe Any di Swift, yang menggambarkan nilai dari tipe apa pun, baik itu kelas, enumerasi, struktur, atau tipe Swift lainnya. Perubahan ini membuat Objective - C APIs lebih fleksibel dalam Swift, karena tipe nilai Swift-didefinisikan dapat diteruskan ke Objective - C APIs dan diambil sebagai tipe Swift, menghilangkan kebutuhan untuk tipe "blok" manual.
Dengan demikian,
disarankan untuk menggunakan AnyObject ketika Anda ingin membatasi protokol sehingga hanya dapat digunakan dengan kelas, dan
Any dalam kasus lain .
Apple menambahkan :
Gunakan
Any dan
AnyObject hanya ketika Anda secara eksplisit membutuhkan perilaku dan kemampuan yang mereka berikan. Itu selalu terbaik untuk menjadi akurat tentang jenis yang Anda harapkan untuk digunakan dalam kode Anda.