- PVSM.RU - https://www.pvsm.ru -
Довольно долгое время в своих проектах при написании когда я использовал тип Any, например при обработке JSON данных. Но также я знал что есть и второй тип — AnyObject. И недавно я задумался о разнице между этими двумя типами.
Согласно документации Apple:
Если сказать чуть проще, то:
Проверим на деле эти два типа. Начнем с типа Any.
Для этого создадим массив с типом Any, и распечатаем его.
let anyArray: [Any] = ["Macbook", 1, 2]
print(anyArray)
Console: ["Macbook", 1, 2]
Как мы видим, Any позволяет работать с различными типами данных одновременно (String, Int).
Согласно документации, элементы (String [2] и Int [3]) в этом массиве являются структурами, которые являются типами значений, поэтому, теоретически, AnyObject не должен работать.
Чтобы проверить это, создадим идентичный массив, с типом AnyObject.
let anyObjectArray: [AnyObject] = ["Macbook", 1, 2]
Как и ожидалось, компилятор выдает нам ошибку о невозможности преобразовании типа «String/Int» к типу AnyObject
Но давайте все таки попробуем привести три наших типа к AnyObject и распечатать результат.
let anyObjectArray: [AnyObject] = ["Macbook" as AnyObject, 1 as AnyObject, 2 as AnyObject]
print(anyObjectArray)
Console: [Macbook, 1, 2]
Ошибка компилятора исчезла. Как мы видим, строка Macbook явно выглядит как строка, но не имеет привычных кавычек как у типа String в Swift.
Попробуем распечатать массив с помощью цикла, чтобы проверить их фактический тип.
for item in anyObjectArray {
if item is String {
print("(item) является типом String")
} else if item is Int {
print("(item) является типом Int")
}
}
Console:
Macbook является типом String
1 является типом Int
2 является типом Int
Строка имеет тип String. Как было сказано раньше, строки в Swift являются структурами, а не типами классов. Значит, мы не должны иметь возможность использовать их как AnyObject.
Проведем еще пару экспериментов с нашим массивом. Попробуем проверить их на типы из Objective‑C: NSString [4] и NSNumber [5].
for item in anyObjectArray {
if item is NSString {
print("(item) является типом NSString")
} else if item is NSNumber {
print("(item) является типом NSNumber")
}
}
Console:
Macbook является типом NSString
1 является типом NSNumber
2 является типом NSNumber
Как часть своей совместимости с Objective‑C, Swift предлагает удобные и эффективные способы работы с платформами Cocoa.
Swift автоматически преобразует некоторые типы Objective‑C в типы Swift, а некоторые типы Swift в типы Objective‑C. Типы, которые можно конвертировать между Objective‑C и Swift, называются соединенными.
Другими словами, компилятор делает все возможное, чтобы быть гибким в обработке таких типов посредством автоматического преобразования и создания «мостов», в то же время предотвращая сбои приложения.
Как говорится в документации Apple, AnyObject может быть использован для работы с объектами, которые являются производными от Class, но не имеют общего корневого класса.
В Swift 3 [6] тип id в Objective‑C теперь отображается на тип Any в Swift, который описывает значение любого типа, будь то класс, перечисление, структура или любой другой тип Swift. Это изменение делает API-интерфейсы Objective‑C более гибкими в Swift, поскольку определяемые Swift типы значений могут передаваться в Objective‑C API-интерфейсы и извлекаться как типы Swift, что устраняет необходимость в ручных «блочных» типах.
Таким образом, AnyObject желательно использовать когда вы хотите ограничить протокол, чтобы его можно было использовать лишь с классами, а Any в остальных случаях.
Apple добавляет [7]:
Используйте Any и AnyObject только тогда, когда вам явно нужно поведение и возможности, которые они предоставляют. Всегда лучше быть точным в отношении типов, которые вы ожидаете использовать в своем коде.
Автор: Vailence
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ios/342770
Ссылки в тексте:
[1] AnyObject: https://developer.apple.com/documentation/swift/anyobject
[2] String: https://developer.apple.com/documentation/swift/string
[3] Int: https://developer.apple.com/documentation/swift/int
[4] NSString: https://developer.apple.com/documentation/foundation/nsstring
[5] NSNumber: https://developer.apple.com/documentation/foundation/nsnumber
[6] В Swift 3: https://developer.apple.com/swift/blog/?id=39
[7] Apple добавляет: https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html
[8] Источник: https://habr.com/ru/post/483494/?utm_campaign=483494&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.