2014-09-12 16 views
63

Nie rozumiem kiedy używać AnyObject i kiedy użytkownik Any w Swift.AnyObject i Any in Swift

moim przypadku, mam słownika

[ciąg: ???]

??? : Może być Int, Double, Float, String, Array, Słownik

ktoś może mi wyjaśnić różnicę między AnyObject i czarownicą do użycia w moim przypadku.

Alak

Odpowiedz

76

AnyObject jest tylko dla typów odniesienia (klas), Any jest dla typów wartości i odniesienia.

Powinieneś wybrać numer [String: Any].

Rodzaj Casting dla dowolnego i AnyObject

Swift oferuje dwa specjalne typy do pracy z niespecyficznych typów:

  • Any może oznaczać wystąpienie dowolnego typu w ogóle, w tym funkcja typy .
  • AnyObject może reprezentować wystąpienie dowolnego typu klasy.

UWAGA:

Zastosowanie Any i AnyObject tylko wtedy, gdy wyraźnie potrzeba zachowania i możliwości ich dostarczenia. Zawsze lepiej jest być specyficznym o typach, z którymi chcesz pracować w swoim kodzie.

Od Swift Programming Language: 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ż pamiętać, że podczas pracy z kakao API, to jest powszechne, aby otrzymać tablicę AnyObject, to dlatego, Objective-C tablice NIE są typowe. Musisz więc rzutować je na typ tablicy, jakiego oczekujesz.

-

EDIT: (22 grudnia 2015)
W ostatnim oświadczeniu należy pamiętać, że to się zmienia z Swift 2.0 i Xcode 7.
Apple wprowadzony ‘Lightweight’ generics w Objective-C, tak wiele interfejsów API kakao już teraz zwraca poprawny typ.

Edycja: (18 października 2016)
Należy zauważyć, że, jak Swift 3.0 Cel C id S są importowane jako Any, już nie tak AnyObject.

+11

Zauważ, że 'String',' Array' i 'Dictionary' nie są klasami, dla tych użyć Any. – zaph

+3

Nor Int, Double i Float są. – Teejay

+8

Tak, ale to zwykle oczywiste. Nie jest tak oczywiste, że 'NSString',' NSArray' i 'NSDictionary' są klasami, ale podobnie funkcjonalne wersje Swift nie są klasami, które wywołują wiele twórców. – zaph

29

Czy korzystasz Any lub AnyObject zależy od zamierzonego użytku:

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

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

Kiedy import Foundation lub import UIKit lub import Cocoa, możliwe jest, aby zadeklarować swoją tablicę jako [String: AnyObject], ale w tym przypadku Swift traktuje swoich Int, Double, Float literałów jako NSNumber, swoje String s jako NSString Twoje Array s jak NSArray i słowniki jako NSDictionary, z których wszystkie są obiektami. Słownik używający AnyObject jako typu wartości można przekonwertować na NSDictionary, ale jeden z nich przy użyciu Any nie jest.

0

Generycy są bezpieczni, co oznacza, że ​​jeśli podasz ciąg jako typowy 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 pisania statycznego i jest w stanie podać błąd kompilatora)

Jeśli używasz AnyObject, kompilator nie ma pojęcia, że ​​ten obiekt może być traktowany jako ciąg lub jako liczba całkowita i zasadniczo pozwoli robisz, co chcesz z tym (co jest złe), jak gdybyś próbował użyć obiektu, który został przekazany jako ciąg, gdy jest liczbą całkowitą aplikacja ulegnie awarii. (Dzieje się tak, ponieważ Swift używa dynamicznego pisania i daje tylko błąd runtime).

Powiązane problemy