Какой-либо объект и ни в Swift


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

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

[строкой: ???]

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

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

Алег

5 74

5 ответов:

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

так что вы должны пойти на [String: 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 не типизированы. Поэтому нужно приводить их к типу массива ожидать.

-

EDIT: (22 декабря 2015)
В последнем заявлении обратите внимание, что это изменяется с помощью Swift 2.0 и Xcode 7.
Apple представила ‘легкий’ в Objective-C так много какао API теперь уже возвращает правильный тип.

EDIT: (18 октября 2016)
Обратите внимание, что, начиная с Swift 3.0, Objective-C id s теперь импортируются как Any, больше не как AnyObject.

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

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

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

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

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

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

какой-либо объект может представлять экземпляр любого типа класса.

ладно, достаточно простой - любой используется для всех типов, какой-либо объект используется для типов классов, верно?

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

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

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

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

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