Получение имени класса объекта с String
использованием:
object_getClassName(myViewController)
возвращает что-то вроде этого:
_TtC5AppName22CalendarViewController
Я ищу чистую версию "CalendarViewController"
. Как получить вместо этого очищенную строку имени класса?
Я нашел несколько попыток вопросов по этому поводу, но не фактический ответ. Разве это невозможно вообще?
Ответы:
Строка из экземпляра :
Строка из вида :
Пример:
Проверено с
class
,struct
иenum
.источник
String(describing: MyViewController.self)
как отмечено в нескольких ответах ниже.Foo
вFoo2
но создать класс вFoo
другом месте, это может тормоз код). В случае создания подклассов вы должны использовать либо один,type(of:)
либо вType.self
зависимости от того, что соответствует вашим потребностям. Вероятноtype(of:)
, больше подходит для получения имени класса.ОБНОВЛЕНО к SWIFT 5
Мы можем получить красивые описания имен типов, используя переменную экземпляра через
String
инициализатор, и создавать новые объекты определенного класса.Как например
print(String(describing: type(of: object)))
. Гдеobject
может быть переменная экземпляра, такая как массив, словарь, anInt
, aNSDate
и т. Д.Поскольку
NSObject
это корневой класс большинства иерархий классов Objective C, вы можете попытаться создать расширение дляNSObject
получения имени класса каждого подклассаNSObject
. Как это:Или вы можете создать статическую функцию, чей параметр имеет тип
Any
(протокол, которому неявно соответствуют все типы) и возвращает имя класса как String. Как это:Теперь вы можете сделать что-то вроде этого:
Кроме того, как только мы можем получить имя класса в виде String, мы можем создать новые объекты этого класса :
Может быть, это помогает кому-то там!
источник
classNameAsString
можно упростить доclassName
, ибо для этого «имени» подразумевается его тип.theClassName
это аналог истории Facebook, которая изначально называется facebook.ProjectTest.MyViewController
. Как мне избавиться от этого названия проекта? Я хочу только имя класса.Swift 5
Вот расширение для получения в
typeName
качестве переменной (работа с типом значения или ссылочным типом).Как пользоваться:
источник
Swift 3.0
String(describing: MyViewController.self)
источник
type(of: )
это перегиб там,String(describing: MyViewController.self)
хватитString.init(describing: MyViewController.self)
?init
не нужно.Я предлагаю такой подход ( очень Swifty ):
Он не использует ни самоанализа, ни ручного разборки ( никакой магии! ).
Вот демо:
источник
type(of: self)
Если у вас есть тип
Foo
, следующий код даст вам"Foo"
в Swift 3 и Swift 4:Проблема с большинством ответов здесь заключается в том, что они дают вам
"Foo.Type"
результирующую строку, когда у вас нет экземпляра типа, когда то, что вы действительно хотите, просто"Foo"
. Следующее дает вам"Foo.Type"
, как упоминалось в куче других ответов.Эта
type(of:)
часть не нужна, если вы просто хотите"Foo"
.источник
В Swift 4.1 и сейчас Swift 4.2 :
Если у вас нет экземпляра вокруг:
Если у вас есть экземпляр вокруг:
источник
Чтобы получить имя класса Swift из объекта, например, для объекта var: SomeClass (), используйте
Чтобы получить имя класса Swift из типа класса, например SomeClass, используйте:
Вывод:
источник
Вы можете попробовать так:
источник
Вы можете использовать стандартную библиотечную функцию Swift, которая называется
_stdlib_getDemangledTypeName
так:источник
Чтобы получить имя типа в виде строки в Swift 4 (я не проверял более ранние версии), просто используйте интерполяцию строк:
Вы можете использовать
.self
для самого типа, аtype(of:_)
функцию для экземпляра:источник
Можно также использовать зеркала:
NB. Этот метод также можно использовать для структур и перечислений. Существует displayStyle, который дает представление о том, какой тип структуры:
Возврат является перечислением, поэтому вы можете:
источник
Swift 5.1
Вы можете получить имена классов, структур, перечислений, протоколов и NSObject
Self.self
.источник
String(describing: type(of: self))
)Swift 3.0: вы можете создать расширение, подобное этому. Оно возвращает имя класса без имени проекта.
источник
Вы можете расширить
NSObjectProtocol
в Swift 4, как это:Это сделает вычисляемую переменную
className
доступной для ВСЕХ классов. С помощью этого внутриprint()
инCalendarViewController
напечатает"CalendarViewController"
в консоли.источник
Я искал этот ответ время от времени. Я использую GKStateMachine и хотел наблюдать за изменениями состояния и хотел простой способ увидеть только имя класса. Я не уверен, что это iOS 10 или Swift 2.3, но в этой среде следующее делает именно то, что я хочу:
источник
Вы можете получить имя класса, сделав что-то вроде:
источник
Чтобы получить имя класса в виде String, объявите ваш класс следующим образом
И получить имя класса, используя следующий синтаксис
источник
Попробуйте
reflect().summary
на Class self или экземпляр dynamicType. Разверните необязательные параметры перед получением dynamicType, в противном случае dynamicType является необязательной оболочкой.Сводка - это путь к классу с описанными родовыми типами. Чтобы получить простое имя класса из резюме, попробуйте этот метод.
источник
Вышеуказанные решения не работают для меня. Произведенные в основном проблемы упоминаются в нескольких комментариях:
или
Это решение работало на XCode 9, Swift 3.0:
Я назвал его
classNameCleaned
так, чтобы к нему было проще получить доступ и не вступать в конфликт с будущимиclassName()
изменениями:}
Использование:
источник
Swift 3.0 (MacOS 10.10 и более поздние версии), вы можете получить его из className
источник
NSObject
developer.apple.com/reference/objectivec/nsobject/...Я пробовал
type(of:...)
в Playground с Swift 3. Это мой результат. Это версия формата кода.источник
Swift 5
источник
Этот вид примера для класса вар. Не включайте название пакета.
источник
Если вам не нравится искаженное имя, вы можете диктовать свое собственное имя:
Однако, в конечном счете, было бы лучше научиться разбирать искаженное имя. Формат является стандартным и значимым и не изменится.
источник
Иногда другие решения дают бесполезное имя в зависимости от того, на какой объект вы пытаетесь взглянуть. В этом случае вы можете получить имя класса в виде строки, используя следующее.
⌘ щелкните по функции в xcode, чтобы увидеть некоторые связанные методы, которые довольно полезны. или проверьте здесь https://developer.apple.com/reference/objectivec/objective_c_functions
источник
Swift 5 Вы можете получить class_name в виде строки с помощью String (описывающей: Self.self)
источник
Swift 5.2:
источник
Я использую это в Swift 2.2
источник
Swift 5.1: -
Вы также можете использовать обобщенную функцию для получения имени класса объекта в виде строки
Вызовите эту функцию с помощью следующего: -
Удачного кодирования :)
источник