AnyObject и Any в Swift


92

Я не понимаю, когда использовать AnyObject, а когда - Any в Swift.

В моем случае у меня есть словарь

[Строка: ???]

??? : Может быть Int, Double, Float, String, Array, Dictionary

Может ли кто-нибудь объяснить мне разницу между Any и AnyObject и какой из них использовать в моем случае.

Алак

Ответы:


116

AnyObjectтолько для ссылочных типов (классов), Anyкак для значений, так и для ссылочных типов.

Так что вам стоит пойти на [String: Any].

Приведение типов для Any и AnyObject

Swift предоставляет два специальных типа для работы с неспецифическими типами:

  • Any может вообще представлять экземпляр любого типа, включая типы функций.
  • AnyObject может представлять экземпляр любого типа класса.

НОТА:

Используйте Anyи AnyObjectтолько тогда, когда вам явно необходимы поведение и возможности, которые они предоставляют. Всегда лучше конкретизировать типы, с которыми вы ожидаете работать в своем коде.

Из языка программирования Swift : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Также обратите внимание, что когда вы работаете с Какао API, обычно вы получаете массив AnyObject, потому что массивы Objective-C НЕ типизированы. Поэтому вам нужно привести их к типу массива, который вы ожидаете.

-

РЕДАКТИРОВАТЬ: (22 декабря 2015 г.)
В последнем утверждении обратите внимание, что это меняется в Swift 2.0 и Xcode 7.
Apple представила «облегченные» универсальные шаблоны в Objective-C, поэтому многие API-интерфейсы Cocoa теперь уже возвращают правильный тип.

РЕДАКТИРОВАТЬ: (18 октября 2016 г.)
Обратите внимание, что, начиная с Swift 3.0, Objective-C idтеперь импортируются как Any, а не как AnyObject.


18
Обратите внимание , что String, Arrayи Dictionaryне являются классами, для них использования любого.
zaph

6
Ни Int, ни Double, ни Float не являются.
Teejay

12
Да, но обычно это очевидно. Это не так очевидно , что NSString, NSArrayи NSDictionaryклассы пока что так же функциональные версии Swift не классы и что поездки до многих дэвов.
zaph

1
Any также представляет дополнительные опции? Или это должно быть выражено как Любое?

1
@robdashnash Any не представляет собой опций. ? нужно добавить, чтобы сделать его необязательным
crypt

47

Используете ли вы Anyили AnyObjectзависит от вашего предполагаемого использования:

Если ваш словарь будет использоваться только в пределах Swift коды, то вы должны использовать , Anyпотому что ваши тип ( Int, Double, Float, String, Array, и Dictionary) не являются объектами.

Если вы будете передавать свой словарь подпрограммам Objective-C, которые ожидают NSDictionary, то вам следует использовать AnyObject.

Когда вы import Foundationили import UIKitили import Cocoa, можно объявить массив как [String: AnyObject], но в этом случае Swift обрабатывает ваш Int, Double, Floatлитералы , как NSNumber, ваши Strings как NSString, ваши Arrays как NSArrayи ваши словари , как NSDictionary, все из которых являются объекты. Словарь, использующийся AnyObjectв качестве типа значения, можно преобразовать NSDictionary, а словарь , использующийся Any- нет.


1

Согласно документации Apple Swift,

  • Any может представлять экземпляр любого типа вообще, включая типы функций и дополнительные типы.
  • AnyObject может представлять экземпляр любого типа класса.

Для получения дополнительной информации, пожалуйста, проверьте это: Блог


1

Отметьте этот ТАК-ответ :

Обобщения являются типобезопасными, то есть если вы передадите строку как универсальный и попытаетесь использовать как целое число, компилятор пожалуется, и вы не сможете скомпилировать свой (что хорошо). (Это происходит потому, что Swift использует статическую типизацию и может выдать ошибку компилятора). Если вы используете AnyObject, компилятор понятия не имеет, может ли этот объект рассматриваться как String или как Integer, и в основном позволит вам делать с ним все, что вы хотите (что плохо), как если бы вы пытались использовать объект, который был передается как String, когда это целое число, приложение выйдет из строя. (Это происходит потому, что Swift использует динамическую типизацию и выдает только ошибку времени выполнения)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.