Какой-либо объект и ни в Swift
Я не понимаю, когда использовать AnyObject и когда пользователь любой в Swift.
мой случай, у меня есть словарь
[строкой: ???]
??? : Может быть Int, Double, Float, String, Array, Dictionary
кто-то может объяснить мне разницу между любым и AnyObject и ведьма один, чтобы использовать в моем случае.
Алег
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-Cid
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 использует динамическую типизацию и только даст вам ошибку времени выполнения)