Есть ли способ напечатать тип переменной во время выполнения в Swift? Например:
var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)
println("\(now.dynamicType)")
// Prints "(Metatype)"
println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector
println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method
В приведенном выше примере я ищу способ показать, что переменная "скоро" имеет тип ImplicitlyUnwrappedOptional<NSDate>
, или по крайней мере NSDate!
.
Ответы:
Обновление сентябрь 2016
Swift 3.0: используйте
type(of:)
, напримерtype(of: someThing)
(посколькуdynamicType
ключевое слово было удалено)Обновление октябрь 2015 :
Я обновил приведенные ниже примеры до нового синтаксиса Swift 2.0 (например,
println
был заменен наprint
,toString()
теперьString()
).Из примечаний к выпуску Xcode 6.3 :
@nschum указывает в комментариях, что примечания к выпуску Xcode 6.3 показывают другой путь:
Какие выводы:
Обновление для Xcode 6.3:
Вы можете использовать
_stdlib_getDemangledTypeName()
:и получите это как вывод:
Оригинальный ответ:
До Xcode 6.3
_stdlib_getTypeName
получил искаженное имя типа переменной. Запись в блоге Ewan Swick помогает расшифровать эти строки:Например,
_TtSi
обозначает внутреннийInt
тип Swift .У Майка Эша есть отличная запись в блоге на ту же тему .
источник
_stdlib_getTypeName()
? Интегрированный REPL больше не существует,swift-ide-test
не существует, и печать Xcode модуля Swift_
исключает значения с префиксами.lldb
легко найти символы в репле. Там же_stdlib_getDemangledTypeName()
и_stdlib_demangleName()
.image
был ярлыкtarget modules
. Я закончил темtarget modules lookup -r -n _stdlib_
, что использовал , что, конечно, лучше выражено какimage lookup -r -n _stdlib_ libswiftCore.dylib
dynamicType
ключевое слово было удалено из Swift. Вместоtype(of:)
него была добавлена новая примитивная функция : github.com/apple/swift/blob/master/CHANGELOG.mdРедактировать: новая
toString
функция была введена в Swift 1.2 (Xcode 6.3) .Теперь вы можете распечатать demangled тип любого типа, используя
.self
любой экземпляр, используя.dynamicType
:Попробуйте позвонить
YourClass.self
иyourObject.dynamicType
.Ссылка: https://devforums.apple.com/thread/227425 .
источник
someInstance.dynamicType.printClassName()
напечатает название класса.Swift 3.0
источник
Это то, что вы ищете?
Это печатает "__NSDate"
ОБНОВЛЕНИЕ : Пожалуйста, обратите внимание, что это больше не работает с Beta05
источник
Мой текущий Xcode - Версия 6.0 (6A280e).
Вывод:
источник
Optional(...)
, поэтому ваш код будет возвращаться толькоOptional
как Type. Он также должен отображатьсяvar optionalTestVar: Person? = Person(name:"Sarah")
как Необязательный (Person) и var с Person! as ImplicitlyUnwrappedOptional (Person)Начиная с Xcode 6.3 с Swift 1.2, вы можете просто конвертировать значения типов в полностью разделенные
String
.источник
Вы все еще можете получить доступ к классу через
className
(который возвращает aString
).Есть на самом деле несколько способов , чтобы получить класс, например
classForArchiver
,classForCoder
,classForKeyedArchiver
(все возвратныеAnyClass!
).Вы не можете получить тип примитива (примитив не класс).
Пример:
Если вы хотите получить тип примитива, вы должны использовать
bridgeToObjectiveC()
. Пример:источник
import Cocoa
.className
является частью поддержки AppleScript Какао и определенно не должен использоваться для общего самоанализа. Очевидно, что это не доступно на iOS.Вы можете использовать отражение, чтобы получить информацию об объекте.
Например имя класса объекта:
источник
reflect(x).summary
- спасибо!Мне повезло с:
источник
Xcode 8 Swift 3.0 использует тип (из :)
источник
В Xcode 8, Swift 3.0
шаги:
1. Получить тип:
Опция 1:
Вариант 2:
2. Преобразовать тип в строку:
источник
В Swift 3.0 вы можете использовать
type(of:)
, так какdynamicType
ключевое слово было удалено.источник
SWIFT 5
С последней версией Swift 3 мы можем получить симпатичные описания имен типов через
String
инициализатор. Как напримерprint(String(describing: type(of: object)))
. Гдеobject
может быть переменная экземпляра, такая как массив, словарьInt
, aNSDate
, экземпляр пользовательского класса и т. Д.Вот мой полный ответ: Получить имя класса объекта в виде строки в Swift
Этот вопрос ищет способ получить имя класса объекта в виде строки, но я также предложил другой способ получить имя класса переменной, которая не является подклассом
NSObject
. Вот:Я сделал статическую функцию, которая принимает в качестве параметра объект типа
Any
и возвращает его имя класса какString
:).Я протестировал эту функцию с некоторыми переменными, такими как:
и вывод был:
источник
При использовании Cocoa (не CocoaTouch) вы можете использовать это
className
свойство для объектов, которые являются подклассами NSObject.Это свойство недоступно для обычных объектов Swift, которые не являются подклассами NSObject (и на самом деле в Swift нет корневого идентификатора или типа объекта).
В CocoaTouch в настоящее время нет способа получить строковое описание типа данной переменной. Подобной функциональности также не существует для примитивных типов ни в Cocoa, ни в CocoaTouch.
Swift REPL может распечатать сводку значений, включая ее тип, поэтому возможно, что такой способ самоанализа будет возможен через API в будущем.
РЕДАКТИРОВАТЬ :
dump(object)
кажется, делает свое дело.источник
dump(object)
он действительно мощный. Спасибо.Верхний ответ не имеет рабочего примера нового способа сделать это с помощью
type(of:
. Итак, чтобы помочь новичкам, таким как я, вот рабочий пример, взятый в основном из документации Apple здесь - https://developer.apple.com/documentation/swift/2885064-typeисточник
Я попробовал некоторые другие ответы здесь, но milage, кажется, очень на том, что является подчиненным объектом.
Однако я нашел способ получить имя класса Object-C для объекта, выполнив следующие действия:
Вот и пример того, как вы бы это использовали:
В этом случае он напечатает NSDate в консоли.
источник
Я нашел это решение, которое, надеюсь, может работать на кого-то еще. Я создал метод класса для доступа к значению. Пожалуйста, имейте в виду, что это будет работать только для подкласса NSObject. Но, по крайней мере, это чистое и аккуратное решение.
источник
В последней версии XCode 6.3 с Swift 1.2 я нашел единственный способ:
источник
<swift module name>.<actual class name>
, поэтому вы хотите разделить строку с помощью a.
и получить последний токен.Многие из ответов здесь не работают с последней версией Swift (Xcode 7.1.1 на момент написания).
Текущий способ получения информации состоит в том, чтобы создать
Mirror
и опросить это. Для имени класса это так же просто, как:Дополнительную информацию об объекте также можно получить из
Mirror
. Смотрите http://swiftdoc.org/v2.1/type/Mirror/ для подробностей.источник
Начиная с бета-версии 5 в lldb вы можете увидеть класс объекта с помощью команды:
который выводит что-то вроде:
Расширение команды означает что-то вроде:
Frame Variable
(вывести переменную кадра)-d run_target
(развернуть динамические типы)Полезно знать, что использование «Frame Variable» для вывода значений переменных гарантирует, что код не будет выполнен.
источник
Я нашел решение для самостоятельно разработанных классов (или таких, к которым у вас есть доступ).
Поместите следующее вычисляемое свойство в определение класса вашего объекта:
Теперь вы можете просто вызвать имя класса для вашего объекта следующим образом:
Обратите внимание, что это будет работать только в том случае, если определение вашего класса выполнено в файле, имя которого точно соответствует названию класса, имя которого вы хотите.
Как это обычно бывает, приведенный выше ответ должен делать это в большинстве случаев . Но в некоторых особых случаях вам может понадобиться найти другое решение.
Если вам нужно имя класса внутри самого класса (файла), вы можете просто использовать эту строку:
Может быть, этот метод помогает некоторым людям там.
источник
Основываясь на ответах и комментариях, данных Классом и Кевином Баллардом выше, я бы добавил:
который распечатает:
источник
toString(self.dynamicType).componentsSeparatedByString(".").last!
очевидно, я был в контексте объекта и мог ссылатьсяself
.источник
Swift версия 4:
Спасибо @ Джошуа Дэнс
источник
Свифт 4:
Использование:
источник
Кажется, нет никакого общего способа напечатать имя типа типа произвольного значения. Как уже отмечали другие, для экземпляров классов вы можете напечатать
value.className
но для примитивных значений кажется, что во время выполнения информация о типе исчезает.Например, это выглядит так, как будто нет способа набрать:
1.something()
и выйтиInt
для любого значенияsomething
. (Вы можете, как предложил другой ответ, использовать,i.bridgeToObjectiveC().className
чтобы дать вам подсказку, но на самом деле__NSCFNumber
это не тот тип, кi
которому он будет преобразован, когда он пересекает границу вызова функции Objective-C.)Я был бы рад оказаться ошибочным, но похоже, что проверка типов выполняется во время компиляции, и, как и в C ++ (с отключенным RTTI), большая часть информации о типах исчезает во время выполнения.
источник
Вот как вы получаете строку типа вашего объекта или типа, которая является согласованной и учитывает, к какому модулю принадлежит определение объекта или в который он вложен. Работает в Swift 4.x.
источник
Чтобы получить тип объекта или класс объекта в Swift , вам необходимо использовать тип (of: yourObject)
тип (из: вашОбъект)
источник
Не совсем то, что вам нужно, но вы также можете проверить тип переменной по типам Swift, например:
Например.
источник
Xcode 7.3.1, Swift 2.2:
String(instanceToPrint.self).componentsSeparatedByString(".").last
источник