Этот вопрос уже очень хорошо ответил как на холод, так и на R. Martinho Fernandes.
Я просто не мог упустить эту возможность, чтобы ответить на вопрос с аналогией Гарри Поттера:
class Wizard
{
private:
class LordVoldemort
{
void avada_kedavra()
{
// scary stuff
}
};
public:
using HeWhoMustNotBeNamed = LordVoldemort;
};
int main()
{
Wizard::HeWhoMustNotBeNamed tom; // OK
Wizard::LordVoldemort not_allowed; // Not OK
return 0;
}
Теперь вы можете просто сделать:
String(MyClass)
новый формат на основе xcode 6 beta 5.
(имя_проекта). (Имя_класса)
func getName(classType:AnyClass) -> String {
let classString = NSStringFromClass(classType.self)
let range = classString.rangeOfString(".", options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start:classString.startIndex, end: classString.endIndex), locale: nil)
return classString.substringFromIndex(range!.endIndex)
}
Последняя версия 6.3 Xcode Swift 1.2
, если вам нужно расширение или вы можете поместить его в любой общий объект:
public extension NSObject{
public class var nameOfClass: String{
return NSStringFromClass(self).componentsSeparatedByString(".").last!
}
public var nameOfClass: String{
return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
}
}
Swift 3
type(of: self)
отпечатков ModuleName.ClassName
String(describing: type(of: self))
отпечатков ИмяКласса
На данный момент нет надежного способа сделать это. См. Комментарий разработчика Apple по https://devforums.apple.com/thread/227425
В настоящее время Swift не имеет особого подхода к самоанализу.
Есть некоторые самоанализ машины, которая используется для игровых площадок. Я не знаю, предназначен ли это для API.
Некоторые методы и переменные Swift можно исследовать с помощью самоанализа во время выполнения Objective-C. Это, вероятно, будет лучшим решением сегодня.
У Свифта действительно есть понятие метатипа, несколько аналогичное типу класса в Objective C. Вы можете найти его, используя TypeName.self
, например:
class Foo {
@required init() {
}
}
var normalFoo : Foo = Foo()
var fooType : Foo.Type = Foo.self;
var fooFromMetatype : Foo = fooType();
Возможно, по времени выпуска Метатипы будут включать в себя больше способностей к самоанализу. Я предлагаю подать запрос на функцию радара для этого.
----- Обновлено -----
Как упоминалось @ThomasW, для Swift 4 нам нужно использовать String(describing:type(of:self))
----- Старая запись - ---
Я предпочитаю использовать String(self.dynamicType)
Используйте его в моем проекте https://github.com/JakeLin/SwiftWeather/blob/e7165b0919dda53fd7fcba9b43fdfe150d73c6f8/SwiftWeather/ForecastView. быстрое # L135
В Swift 2 beta 4 вы можете получить информацию через объект типа:
let className = "\(String.self)" // gives: "Swift.String"
или, если у вас есть экземпляр:
let s = "Hello World"
let className = "\(s.dynamicType)" // gives: "Swift.String"
Вы получите Module.Class результат, например:
Swift.String
ABC.MyGenericClass<Swift.Int>
Достаточно забавно, что возвращаемый объект Type не соответствует протоколу CustomStringConvertible. Следовательно, у него нет свойства 'description', хотя шаблон "" по-прежнему работает правильно.
П.С.: До b4 то же самое можно было бы выполнить с помощью рефлекса (obj.dynamicType) .summary.
В Swift v3.0 это работало для меня:
String.init(describing: self.self)
Теперь вы можете использовать следующее для получения имени класса в swift.
let nameSpaceClassName = NSStringFromClass(RWTCountryPopoverViewController.self)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String
Если вы хотите, чтобы в swift было только имя класса, вы можете проанализировать строку, возвращаемую NSStringFromClass ().
Это сделано в nameOfClass.swift репозитория INSwift Github: https://github.com/indieSoftware/INSwift
Swift 4
super.init(nibName:String(describing:MyClass.self), bundle: nil)
myObject.description().componentsSeparatedByString(" ").first!
Это не совсем то, что вы хотите - это добавит нежелательный ведущий '<' и завершающий ':'. Но когда я отлаживаю, я ценю скорость, а не аккуратность, поэтому этот быстрый и грязный трюк сработал для меня.
Вот пример Swift 3+, Xcode 8+ с кодом:
class MySuperbClass{
let a = 4
func getClassName() -> String? {
return String(describing: type(of:self)).components(separatedBy: ".").first
}
}
let className = String(describing: type(of:MySuperbClass.self)).components(separatedBy: ".").first
//className = "MySuperbClass"
let classNameFromObject = MySuperbClass().getClassName()
//classNameFromObject = "MySuperbClass"
Это немного короче. Нет необходимости NSStringFromClass
MyObject.self.description().componentsSeparatedByString(".").last!
Swift 3
NSStringFromClass(self).components(separatedBy: ".").last!