Как я могу узнать, что класс переменной экземпляра находится в Swift

Есть ли простой способ сказать, что class переменная экземпляра в Swift? На языках JVM, к которым я привык, вы можете сделать что-то вроде println(value.class), чтобы получить его класс.

Есть ли что-то эквивалентное в Swift?

Ближайшая вещь, которую я могу найти в документах, - это возможность "проверять тип" с is <Class> keyword, но это только помогает мне немного угадать.

Я столкнулся с несколькими ситуациями в игре, где я думал, что у меня есть один тип класса, но на самом деле был другой и не знал, как узнать наверняка.

Ответы

Ответ 1

Используйте type.self, чтобы вернуть тип, который можно передать в метод, который принимает аргумент уровня. Например, UILabel.self может быть передан вызову метода isKindOfClass. Строковое представление класса можно найти через dynamicType.description():

var label = UILabel()
println(label.dynamicType.description())
println(label.isKindOfClass(UILabel.self))

Свифта-3

var label = UILabel()
println(type(of: label).description())

Выход
UILabel
true

Здесь немного больше фона - есть два выражения, о которых нужно знать: самоопределение postfix и выражение динамического типа. Из документы:

Postfix Self
 Самостоятельное выражение postfix состоит из выражения или имени типа, за которым сразу следует .self. Он имеет следующие формы:

expression.self
type.self

Первая форма оценивает значение выражения. Например, x.self оценивается как x.

Вторая форма оценивает значение типа. Используйте эту форму для доступ к типу в качестве значения. Например, поскольку SomeClass.self оценивает сам тип SomeClass, вы можете передать его функции или метод, который принимает аргумент уровня уровня



Выражение динамического типа
Выражение dynamicType состоит из выражения, немедленно за которым следует .dynamicType. Он имеет следующий вид:

expression.dynamicType

Выражение can not является именем типа. Весь динамический тип выражение оценивает значение типа времени выполнения выражение.

Ответ 2

Начиная с бета-версии 6 _stdlib_getTypeName получает измененное имя переменной. Вставьте это в пустую детскую площадку:

import Foundation

class PureSwiftClass {
}

var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"

println( "TypeName0 = \(_stdlib_getTypeName(myvar0))")
println( "TypeName1 = \(_stdlib_getTypeName(myvar1))")
println( "TypeName2 = \(_stdlib_getTypeName(myvar2))")
println( "TypeName3 = \(_stdlib_getTypeName(myvar3))")

Вывод:

TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS

Запись в блоге Ewan Swick помогает расшифровать эти строки:

например. _TtSi обозначает внутренний тип Swift Int.

У Майка Эша отличная запись в блоге, посвященная той же теме.