AnyObject и Any в Swift

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

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

[String:???]

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

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

Алег

Ответ 1

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

Итак, вы должны пойти на [String: Any].

Тип литья для Any и AnyObject

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

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

Примечание:

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

От Язык быстрого языка: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID342

-

Также обратите внимание, что когда вы работаете с API Cocoa, для получения массива 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.

Ответ 2

Использование 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, ваш String как NSString, ваш Array как NSArray, а ваши словари как NSDictionary, все из которых являются объектами. Словарь с использованием AnyObject в качестве типа значения может быть конвертирован в NSDictionary, но с использованием Any нет.

Ответ 3

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

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