Когда вы пытаетесь понять программу или в некоторых сложных случаях, полезно иметь возможность на самом деле узнать, что это за тип. Я знаю, что отладчик может показать вам некоторую информацию о типе, и вы обычно можете полагаться на вывод типа, чтобы не указывать тип в таких ситуациях, но, тем не менее, мне бы очень хотелось иметь что-то вроде Pythontype()
dynamicType (см. этот вопрос )
Обновление: это было изменено в последней версии Swift, obj.dynamicType
теперь дает ссылку на тип, а не на экземпляр динамического типа.
Это кажется самым многообещающим, но до сих пор я не смог выяснить фактический тип
class MyClass {
var count = 0
}
let mc = MyClass()
# update: this now evaluates as true
mc.dynamicType === MyClass.self
Я также попытался использовать ссылку на класс для создания экземпляра нового объекта, который делает работу, но как ни странно дал мне ошибку говоря , что я должен добавить required
инициализатор:
работает:
class MyClass {
var count = 0
required init() {
}
}
let myClass2 = MyClass.self
let mc2 = MyClass2()
Тем не менее, это всего лишь небольшой шаг к фактическому обнаружению типа любого данного объекта.
редактирование : я удалил значительное количество теперь не относящихся к делу деталей - посмотрите историю изменений, если вам интересно :)
источник
print(mc)
илиdump(mc)
напечатает резюме (которое вы можете получитьtoString(mc)
илиreflect(mc).summary
), которое будет содержать имя класса где-то там. Но не ясно, как получить только имя класса самостоятельно.Ответы:
Версия Swift 3:
источник
var myVar: SomeType!
. Компилятор выдает ошибку «Невозможно преобразовать значение типа« SomeType! .Type »(он же« ImplicitlyUnwrappedOptional <SomeType> .Type ») в тип ожидаемого аргумента« AnyClass »(он же« AnyObject.Type »). Компилятор предлагает добавитьas! AnyClass
после типа, но затем программа аварийно завершает работу с некоторым «EXC_BAD_INSTRUCTION» и другим jiberrish, который я не могу расшифроватьString
который передается как тип,Any
тоtype(of:)
будет выводитьAny
, а неString
.Swift 2.0:
Правильный способ сделать такой тип самоанализа был бы с помощью структуры Mirror ,
Затем для доступа к самому типу из
Mirror
структуры вы должны использовать свойствоsubjectType
следующим образом:Затем вы можете использовать что-то вроде этого:
источник
String
иOptional(String)
не одинаковы.Код
dynamicType.printClassName
взят из примера в книге Swift. Я не знаю, как напрямую получить пользовательское имя класса, но вы можете проверить тип экземпляров, используяis
ключевое слово, как показано ниже. В этом примере также показано, как реализовать пользовательскую функцию className, если вы действительно хотите, чтобы имя класса было строкой.Обратите внимание:
что подклассы
NSObject
уже реализуют свою собственную функцию className. Если вы работаете с Какао, вы можете просто использовать это свойство.источник
subjectType
больше не доступен иdynamicType
вызывает сообщение об устаревании от компилятора.Начиная с Xcode 6.0.1 (по крайней мере, не уверен, когда они добавили его), ваш оригинальный пример теперь работает:
Обновить:
Чтобы ответить на исходный вопрос, вы можете успешно использовать среду выполнения Objective C с простыми объектами Swift.
Попробуйте следующее:
источник
Если вам просто нужно проверить, относится ли переменная к типу X или соответствует ли она какому-либо протоколу, вы можете использовать ее
is
, илиas?
как показано ниже:Это эквивалентно
isKindOfClass
в Obj-C.И это эквивалентно
conformsToProtocol
, илиisMemberOfClass
источник
as?
условным приведением делает то же самоеisKindOfClass
, но также предоставляет результат преобразования, если оно выполнено успешно.isMemberOfClass
является условиеobject.dynamicType == ClassName.self
.Свифт 3:
источник
is
существует до Swift 3 ...?Для Swift 3.0
Для Swift 2.0 - 2.3
источник
Вот 2 способа, которые я рекомендую сделать это:
Или:
Вот подробный пример:
источник
print( aShape is Square )
,is
Оператор является более предпочтительным.Зависит от варианта использования. Но давайте предположим, что вы хотите сделать что-то полезное с вашими «переменными» типами.
switch
Заявление Swift очень мощно и может помочь вам получить результаты, которые вы ищете ...В этом случае используйте простой словарь, содержащий пары ключ / значение, которые могут быть UInt, Int или String. В
.filter()
методе из словаря мне нужно убедиться, что я проверяю значения правильно и проверяю только строку, если она является строкой и т. Д. Оператор switch делает это простым и безопасным! Присваивая 9 переменной типа Any, он выполняет переключение для Int. Попробуйте изменить это на:..и попробуйте еще раз. На этот раз он выполняет
as String
дело.источник
Если вы получаете предупреждение «всегда верно / неуспешно», вам может потребоваться привести к Any перед использованием
is
источник
источник