AnyObject dan Any di Swift

92

Saya tidak mengerti kapan harus menggunakan AnyObject dan kapan harus menggunakan Any di Swift.

Dalam kasus saya, saya memiliki Kamus

[String: ???]

??? : Bisa Int, Double, Float, String, Array, Dictionary

Adakah yang bisa menjelaskan perbedaan antara Any dan AnyObject dan mana yang akan digunakan dalam kasus saya.

Alak

Alak
sumber

Jawaban:

116

AnyObjecthanya untuk tipe referensi (kelas), Anyuntuk tipe nilai dan referensi.

Jadi, Anda harus pergi [String: Any].

Ketik Casting untuk Any dan AnyObject

Swift menyediakan dua tipe khusus untuk bekerja dengan tipe nonspesifik:

  • Any dapat mewakili sebuah instance dari tipe apa pun, termasuk tipe fungsi.
  • AnyObject dapat mewakili instance dari jenis kelas apa pun.

CATATAN:

Gunakan Anydan AnyObjecthanya jika Anda secara eksplisit membutuhkan perilaku dan kemampuan yang mereka sediakan. Itu selalu lebih baik untuk lebih spesifik tentang jenis yang ingin Anda kerjakan dalam kode Anda.

Dari Bahasa Pemrograman Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Perhatikan juga bahwa ketika Anda bekerja dengan Cocoa API, adalah umum untuk menerima Array dari AnyObject, ini karena array Objective-C TIDAK dicirikan. Jadi, Anda perlu mentransmisikannya ke tipe array yang Anda harapkan.

-

EDIT: (22 desember 2015)
Pada pernyataan terakhir, perhatikan bahwa ini berubah dengan Swift 2.0 dan Xcode 7.
Apple telah memperkenalkan generik 'Ringan' di Objective-C sehingga banyak Cocoa API sekarang sudah mengembalikan jenis yang benar.

EDIT: (18 Oktober 2016)
Perhatikan bahwa, mulai Swift 3.0, Objective-C idsekarang diimpor sebagai Any, bukan lagi sebagai AnyObject.

Teejay
sumber
18
Perhatikan bahwa String, Arraydan Dictionarybukan kelas, untuk penggunaan ini Any.
zaf
6
Nor Int, Double dan Float adalah.
Teejay
12
Ya tapi itu biasanya sudah jelas. Tidak begitu jelas bahwa NSString, NSArraydan NSDictionarymerupakan kelas namun versi Swift yang berfungsi sama bukanlah kelas dan yang membuat banyak pengembang.
zaph
1
Apakah Any juga mewakili pilihan? Atau haruskah itu diungkapkan sebagai Any?
1
@robdashnash Any tidak mewakili pilihan. ? harus ditambahkan untuk menjadikannya opsional
crypt
47

Apakah Anda menggunakan Anyatau AnyObjectbergantung pada tujuan penggunaan Anda:

Jika kamus Anda hanya akan digunakan dalam kode Swift, maka Anda harus menggunakan Anykarena jenis Anda ( Int, Double, Float, String, Array, dan Dictionary) tidak objek.

Jika Anda akan meneruskan kamus Anda ke rutinitas Objective-C yang mengharapkan NSDictionary, maka Anda harus menggunakan AnyObject.

Bila Anda import Foundationatau import UIKitatau import Cocoa, adalah mungkin untuk mendeklarasikan array Anda sebagai [String: AnyObject], namun dalam kasus ini Swift memperlakukan Anda Int, Double, Floatliteral sebagai NSNumber, Anda Stringsebagai NSString, Anda Arraysebagai NSArray, dan kamus Anda sebagai NSDictionary, yang semuanya objek. Sebuah kamus yang digunakan AnyObjectsebagai tipe nilai dapat diubah menjadi NSDictionary, tetapi yang menggunakan Anytidak.

vacawama
sumber
1

Menurut dokumentasi Swift Apple,

  • Any dapat mewakili instance dari tipe apa pun, termasuk tipe fungsi dan tipe opsional.
  • AnyObject dapat mewakili turunan dari semua jenis kelas.

Untuk lebih jelasnya silahkan cek ini: Blog

Rohit Sisodia
sumber
1

Periksa jawaban SO ini :

Generik adalah tipe aman, artinya jika Anda mengirimkan string sebagai generik dan mencoba menggunakan sebagai integer, kompiler akan mengeluh dan Anda tidak akan dapat mengkompilasi (yang bagus). (Ini terjadi karena Swift menggunakan pengetikan Statis, dan dapat memberikan Anda kesalahan kompiler). Jika Anda menggunakan AnyObject, compiler tidak tahu apakah objek ini dapat diperlakukan sebagai String atau Integer dan pada dasarnya akan memungkinkan Anda melakukan apa pun yang Anda inginkan (yang buruk) seolah-olah Anda mencoba menggunakan objek yang telah diteruskan sebagai String ketika itu adalah Integer, aplikasi akan macet. (Ini terjadi karena Swift menggunakan pengetikan Dinamis dan hanya akan memberi Anda kesalahan waktu proses)

Ved Rauniyar
sumber