AnyObject та Any у Swift


92

Я не розумію, коли використовувати AnyObject, а коли Any в Swift.

У моєму випадку у мене є Словник

[Рядок: ???]

??? : Може бути Int, Double, Float, String, Array, Dictionary

Хтось може пояснити мені різницю між Any та AnyObject та те, який із них використовувати у моєму випадку.

Аляк

Відповіді:


116

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

Тож вам слід піти [String: Any].

Введіть тип Casting для 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 НЕ типізуються. Отже, вам потрібно передати їх на тип масиву, який ви очікуєте.

-

EDIT: (22 грудня 2015 р.)
В останньому твердженні зауважте, що це змінюється із Swift 2.0 та Xcode 7.
Apple представила «Легкі» загальні засоби в Objective-C, тому багато API какао вже повертають правильний тип.

EDIT: (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
Чи представляє хтось також опціонерів? Або це слід виражати як Будь-яке?

1
@robdashnash Any не представляє опціонів. ? слід додати, щоб зробити його необов’язковим
склеп

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,

  • Будь-який може представляти екземпляр будь-якого типу взагалі, включаючи типи функцій та необов’язкові типи.
  • AnyObject може представляти екземпляр будь-якого типу класу.

Для отримання детальної інформації перегляньте це: Блог


1

Перевірте цю відповідь SO :

Узагальнення є безпечними для типу, тобто якщо ви передасте рядок як загальний і спробуєте використовувати як ціле число компілятор скаржиться, і ви не зможете скомпілювати свій (що добре). (Це трапляється тому, що Swift використовує статичне введення тексту і може дати вам помилку компілятора). Якщо ви використовуєте AnyObject, компілятор не підозрює, що цей об’єкт можна розглядати як рядок або як ціле число і в основному дозволить вам робити з ним все, що завгодно (що погано), як якщо б ви намагалися використовувати об’єкт, передається як рядок, коли це ціле число, програма вийде з ладу. (Це трапляється тому, що Swift використовує динамічне введення тексту, і лише дасть вам помилку виконання)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.