AnyObject und Any in Swift


90

Ich verstehe nicht, wann AnyObject und wann Any in Swift verwendet werden soll.

In meinem Fall habe ich ein Wörterbuch

[String: ???]

??? : Kann Int, Double, Float, String, Array, Dictionary sein

Kann mir jemand den Unterschied zwischen Any und AnyObject erklären und welches in meinem Fall zu verwenden ist.

Alak

Antworten:


113

AnyObjectgilt nur für Referenztypen (Klassen), Anygilt sowohl für Werttypen als auch für Referenztypen.

Also solltest du gehen [String: Any].

Geben Sie Casting für Any und AnyObject ein

Swift bietet zwei spezielle Typen für die Arbeit mit unspezifischen Typen:

  • Any kann überhaupt eine Instanz eines beliebigen Typs darstellen, einschließlich Funktionstypen.
  • AnyObject kann eine Instanz eines beliebigen Klassentyps darstellen.

HINWEIS:

Verwenden Sie Anyund AnyObjectnur, wenn Sie das von ihnen bereitgestellte Verhalten und die Funktionen ausdrücklich benötigen. Es ist immer besser, genau zu bestimmen, mit welchen Typen Sie in Ihrem Code arbeiten möchten.

Aus der Swift-Programmiersprache : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

- -

Beachten Sie außerdem, dass bei der Arbeit mit der Cocoa-API häufig ein Array von AnyObject empfangen wird. Dies liegt daran, dass Objective-C-Arrays NICHT typisiert sind. Sie müssen sie also in den erwarteten Array-Typ umwandeln.

- -

BEARBEITEN: (22. Dezember 2015)
Beachten Sie bei der letzten Aussage, dass sich dies mit Swift 2.0 und Xcode 7 ändert.
Apple hat in Objective-C 'Lightweight'-Generika eingeführt , sodass viele Cocoa-APIs bereits den richtigen Typ zurückgeben.

BEARBEITEN: (18. Oktober 2016)
Beachten Sie, dass ab Swift 3.0 Objective- idCs jetzt als Anyund nicht mehr als importiert werden AnyObject.


18
Beachten Sie, dass String, Arrayund Dictionarysind nicht Klassen, für diese Verwendung Any.
Zaph

6
Auch Int, Double und Float sind es nicht.
Teejay

11
Ja, aber das ist normalerweise offensichtlich. Es ist nicht so offensichtlich , dass NSString, NSArrayund NSDictionarysind Klassen noch die ähnlich funktionalen Swift - Versionen werden nicht Klassen und dass die Trips viele Devs.
Zaph

1
Stellt Any auch Optionen dar? Oder sollte das als Beliebig ausgedrückt werden?

1
@robdashnash Any repräsentiert keine Optionen. ? sollte hinzugefügt werden, um es optional zu machen
Krypta

46

Ob Sie verwenden Anyoder AnyObjectvon Ihrem Verwendungszweck abhängen:

Wenn Ihr Wörterbuch nur innerhalb Swift - Code verwendet wird, dann sollten Sie verwenden , Anyweil Ihre Typen ( Int, Double, Float, String, Array, und Dictionary) sind nicht Objekte.

Wenn Sie Ihr Wörterbuch an Objective-C-Routinen übergeben, die eine erwarten NSDictionary, sollten Sie verwenden AnyObject.

Wenn Sie import Foundationoder import UIKitoder import Cocoaist es möglich , das Array als zu erklären [String: AnyObject], aber in diesem Fall Swift Ihr behandelt Int, Double, FloatLiterale alsNSNumber Ihr Strings wie NSString, Ihre Arrays wie NSArrayund Ihre Wörterbücher wie NSDictionary, von denen alle Objekte sind. Ein Wörterbuch, das AnyObjectals Werttyp verwendet wird, kann in konvertiert werden NSDictionary, ein Wörterbuch jedoch Anynicht.


1

Laut Apples Swift-Dokumentation

  • Jeder kann eine Instanz eines beliebigen Typs darstellen, einschließlich Funktionstypen und optionaler Typen.
  • AnyObject kann eine Instanz eines beliebigen Klassentyps darstellen.

Weitere Details finden Sie hier: Blog


1

Überprüfen Sie diese SO-Antwort :

Generika sind typsicher. Wenn Sie also einen String als Generikum übergeben und versuchen, ihn als Ganzzahl zu verwenden, beschwert sich der Compiler und Sie können Ihren nicht kompilieren (was gut ist). (Dies geschieht, weil Swift die statische Typisierung verwendet und Ihnen einen Compilerfehler geben kann.) Wenn Sie AnyObject verwenden, hat der Compiler keine Ahnung, dass dieses Objekt als String oder als Ganzzahl behandelt werden kann, und ermöglicht es Ihnen grundsätzlich, damit zu tun, was Sie wollen (was schlecht ist), als ob Sie versuchen, ein Objekt zu verwenden, das zuvor verwendet wurde Als String übergeben, wenn es sich um eine Ganzzahl handelt, stürzt die Anwendung ab. (Dies geschieht, weil Swift die dynamische Eingabe verwendet und nur einen Laufzeitfehler ausgibt.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.