AnyObject ve Swift'de Any


92

AnyObject'i ne zaman ve Swift'de ne zaman kullanacağımı anlamıyorum.

Benim durumumda bir sözlüğüm var

[Dize: ???]

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

Birisi bana Any ve AnyObject arasındaki farkı ve benim durumumda hangisinin kullanılacağını açıklayabilir mi?

Alak

Yanıtlar:


116

AnyObjectyalnızca başvuru türleri (sınıflar) içindir, Anyhem değer hem de başvuru türleri içindir.

Yani gitmelisin [String: Any].

AnyObject için Tip Döküm

Swift, spesifik olmayan türlerle çalışmak için iki özel tür sağlar:

  • Any işlev türleri de dahil olmak üzere herhangi bir türden bir örneği temsil edebilir.
  • AnyObject herhangi bir sınıf türünün bir örneğini temsil edebilir.

NOT:

Kullanım Anyve AnyObjectyalnızca açık bir şekilde sağladıkları davranış ve yetenekleri gerektiğinde. Kodunuzda çalışmayı beklediğiniz türler hakkında net olmak her zaman daha iyidir.

Gönderen Swift Programlama Dili : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Ayrıca, Cocoa API ile çalışırken, bir AnyObject Dizisi almanın yaygın olduğunu unutmayın, bunun nedeni, Objective-C dizilerinin tiplendirilmemiş olmasıdır. Bu yüzden onları beklediğiniz dizi türüne çevirmeniz gerekir.

-

DÜZENLEME: (22 Aralık 2015)
Son açıklamaya göre, bunun Swift 2.0 ve Xcode 7 ile değiştiğine dikkat edin.
Apple, Objective-C'ye 'Hafif' jenerikler sunduğundan pek çok Cocoa API'si artık doğru türü döndürüyor.

DÜZENLEME: (18 Ekim 2016)
Swift 3.0'dan itibaren Objective- idC'lerin Anyartık AnyObject.


18
Not String, Arrayve Dictionarybu kullanım Herhangi için, sınıflar değildir.
zaph

6
Ne de Int, Double ve Float vardır.
Teejay

12
Evet ama bu genellikle açıktır. O kadar bariz değildir NSString, NSArrayve NSDictionarysınıflar henüz benzer fonksiyonel Swift versiyonları sınıflar ve birçok devs kadar bu geziler değil mi.
zaph

1
Herhangi biri de opsiyonelleri temsil ediyor mu? Yoksa bu Herhangi biri olarak mı ifade edilmelidir?

1
@robdashnash Herhangi biri isteğe bağlı özellikleri temsil etmez. ? isteğe bağlı hale getirmek için eklenmelidir
crypt

47

Kullanıp kullanmadığınız Anyveya kullanım AnyObjectamacınıza bağlı:

Senin Sözlük yalnızca Swift kodu içinde kullanılacaksa, o zaman kullanmalıyım Anysenin türleri (çünkü Int, Double, Float, String, Array, ve Dictionary) değildir nesneleri.

Sözlüğünüzü bir bekleyen Objective-C rutinlerine aktaracaksanız NSDictionary, kullanmalısınız AnyObject.

Ne zaman import Foundationya da import UIKitya da import Cocoabu gibi diziyi bildirmek mümkündür [String: AnyObject], ancak bu durumda Swift davranıyor senin Int, Double, Floathazır bilgi olarak NSNumbersizin, Strings olarak NSString, sizin Arraykadar s NSArrayve gibi sözlükler NSDictionarynesnelerdir hepsi. AnyObjectDeğer türü olarak kullanılan bir sözlüğe dönüştürülebilir NSDictionary, ancak kullanan bir sözlüğe dönüştürülemez Any.


1

Apple'ın Swift belgelerine göre,

  • Herhangi biri, işlev türleri ve isteğe bağlı türler dahil olmak üzere herhangi bir türün örneğini temsil edebilir.
  • AnyObject, herhangi bir sınıf türünün bir örneğini temsil edebilir.

Daha fazla ayrıntı için lütfen şunu kontrol edin: Blog


1

Bu SO cevabını kontrol edin :

Jenerikler tür güvenlidir, yani bir dizgeyi genel olarak iletirseniz ve bir tamsayı olarak kullanmaya çalışırsanız, derleyici şikayet eder ve (ki bu iyidir) derlemenizi derleyemezsiniz. (Bu, Swift'in Statik yazmayı kullandığı ve size bir derleyici hatası verebildiği için olur). AnyObject kullanırsanız, derleyicinin hiçbir fikri yoktur, bu nesne bir Dize veya Tamsayı olarak değerlendirilebilir ve temelde sanki eski bir nesneyi kullanmaya çalışırsınız (kötü olan) onunla istediğiniz her şeyi yapmanıza izin verir. Bir Tamsayı olduğunda bir Dize olarak geçirilir, uygulama çöker. (Bu, Swift'in Dinamik yazmayı kullandığı ve size yalnızca bir çalışma zamanı hatası verdiği için olur)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.