Any dan AnyObject di Swift. Apa perbedaan mereka?

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 AnyObject

Kesalahan kompiler
Tidak 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.

Source: https://habr.com/ru/post/id483494/


All Articles