AnyObject i Any in Swift

92

Nie rozumiem, kiedy używać AnyObject, a kiedy Any w Swift.

W moim przypadku mam słownik

[Strunowy: ???]

??? : Może być Int, Double, Float, String, Array, Dictionary

Czy ktoś może mi wyjaśnić różnicę między Any i AnyObject i którego użyć w moim przypadku.

Alak

Alak
źródło

Odpowiedzi:

116

AnyObjectdotyczy tylko typów referencyjnych (klas), Anydotyczy zarówno typów wartości, jak i typów referencyjnych.

Więc powinieneś iść [String: Any].

Typ rzutowania dla Any i AnyObject

Swift udostępnia dwa specjalne typy do pracy z typami niespecyficznymi:

  • Any może w ogóle reprezentować instancję dowolnego typu, w tym typy funkcji.
  • AnyObject może reprezentować instancję dowolnego typu klasy.

UWAGA:

Używaj Anyi AnyObjecttylko wtedy, gdy wyraźnie potrzebujesz zachowania i możliwości, które zapewniają. Zawsze lepiej jest dokładnie określić typy, z którymi zamierzasz pracować w swoim kodzie.

Z języka programowania Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Należy również zauważyć, że podczas pracy z interfejsem API Cocoa często otrzymuje się tablicę AnyObject, ponieważ tablice Objective-C NIE są typowane. Musisz więc rzutować je na oczekiwany typ tablicy.

-

EDYCJA: (22 grudnia 2015 r.)
W ostatnim oświadczeniu zwróć uwagę, że zmienia się to w przypadku Swift 2.0 i Xcode 7.
Firma Apple wprowadziła „Lekkie” typy generyczne w Objective-C, więc wiele interfejsów API Cocoa zwraca już prawidłowy typ.

EDYCJA: (18 października 2016 r.)
Należy zauważyć, że od wersji Swift 3.0 obiekty Objective-C idsą teraz importowane jako Any, a nie już jako AnyObject.

Teejay
źródło
18
Należy zauważyć, że String, Arrayi Dictionarynie są zajęcia dla tych użyć dowolnego.
zaph
6
Ani Int, Double i Float nie są.
Teejay
12
Tak, ale to jest zwykle oczywiste. Nie jest to takie oczywiste NSString, NSArrayi NSDictionaryto są klasy, ale podobnie funkcjonalne wersje Swift nie są klasami i to wyzwala wielu programistów.
zaph
1
Czy Any reprezentuje również opcje? A może powinno to być wyrażone jako Any?
1
@robdashnash Any nie reprezentuje opcji. ? należy dodać, aby było opcjonalne
krypta
47

Niezależnie od tego, czy używasz, Anyczy AnyObjectzależy od zamierzonego zastosowania:

Jeśli słownik będą wykorzystywane wyłącznie w ramach kodu SWIFT, należy użyć Anyponieważ wasze typy ( Int, Double, Float, String, Array, i Dictionary) nie są obiektami.

Jeśli będziesz przekazywać swój słownik do procedur Objective-C, które oczekują an NSDictionary, powinieneś użyć AnyObject.

Kiedy import Foundationalbo import UIKitczy import Cocoamożliwe jest, aby zadeklarować swoją tablicę jako [String: AnyObject], ale w tym przypadku Swift traktuje swoje Int, Double, Floatliterały jak NSNumbertwoje Strings jak NSString, twoi Arrays jak NSArrayi twoi jak słowniki NSDictionary, z których wszystkie są obiektami. Słownik używający AnyObjectjako typu wartości jest konwertowany na NSDictionary, ale używany Anynie.

vacawama
źródło
1

Zgodnie z dokumentacją Apple Swift,

  • Any może w ogóle reprezentować wystąpienie dowolnego typu, w tym typy funkcji i typy opcjonalne.
  • AnyObject może reprezentować instancję dowolnego typu klasy.

Aby uzyskać więcej informacji, sprawdź to: Blog

Rohit Sisodia
źródło
1

Sprawdź tę odpowiedź :

Typy generyczne są bezpieczne dla typów, co oznacza, że ​​jeśli przekażesz łańcuch jako rodzaj ogólny i spróbujesz użyć go jako liczby całkowitej, kompilator będzie narzekał i nie będziesz w stanie skompilować swojego (co jest dobre). (Dzieje się tak, ponieważ Swift używa wpisywania statycznego i może podać błąd kompilatora). Jeśli używasz AnyObject, kompilator nie ma pojęcia, czy ten obiekt może być traktowany jako ciąg lub jako liczba całkowita i zasadniczo pozwoli ci zrobić z nim cokolwiek chcesz (co jest złe), tak jakbyś próbował użyć obiektu, który został przekazane jako ciąg znaków, jeśli jest to liczba całkowita, aplikacja ulegnie awarii. (Dzieje się tak, ponieważ Swift używa dynamicznego pisania i powoduje tylko błąd w czasie wykonywania)

Ved Rauniyar
źródło