Получить удобочитаемую версию имени класса в swift (в objc NSStringFromClass был в порядке)

Этот вопрос уже очень хорошо ответил как на холод, так и на 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;
}
29
задан jfla 8 June 2014 в 15:36
поделиться

14 ответов

Теперь вы можете просто сделать:

String(MyClass)
61
ответ дан NatashaTheRobot 8 June 2014 в 15:36
поделиться

новый формат на основе 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!
    }
}
25
ответ дан ImpactZero 8 June 2014 в 15:36
поделиться

Swift 3

type(of: self) отпечатков ModuleName.ClassName

String(describing: type(of: self)) отпечатков ИмяКласса

13
ответ дан Timonea 8 June 2014 в 15:36
поделиться

На данный момент нет надежного способа сделать это. См. Комментарий разработчика 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();

Возможно, по времени выпуска Метатипы будут включать в себя больше способностей к самоанализу. Я предлагаю подать запрос на функцию радара для этого.

5
ответ дан Adam Wright 8 June 2014 в 15:36
поделиться

----- Обновлено -----

Как упоминалось @ThomasW, для Swift 4 нам нужно использовать String(describing:type(of:self))

----- Старая запись - ---

Я предпочитаю использовать String(self.dynamicType)

Используйте его в моем проекте https://github.com/JakeLin/SwiftWeather/blob/e7165b0919dda53fd7fcba9b43fdfe150d73c6f8/SwiftWeather/ForecastView. быстрое # L135

2
ответ дан Jake Lin 8 June 2014 в 15:36
поделиться

В 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.

5
ответ дан hnh 8 June 2014 в 15:36
поделиться

В Swift v3.0 это работало для меня:

String.init(describing: self.self)
3
ответ дан Coach Roebuck 8 June 2014 в 15:36
поделиться

Теперь вы можете использовать следующее для получения имени класса в swift.

let nameSpaceClassName = NSStringFromClass(RWTCountryPopoverViewController.self)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String
1
ответ дан TheCodingArt 8 June 2014 в 15:36
поделиться

Если вы хотите, чтобы в swift было только имя класса, вы можете проанализировать строку, возвращаемую NSStringFromClass ().

Это сделано в nameOfClass.swift репозитория INSwift Github: https://github.com/indieSoftware/INSwift

1
ответ дан David Moles 8 June 2014 в 15:36
поделиться

Swift 4

super.init(nibName:String(describing:MyClass.self), bundle: nil)
0
ответ дан DMagaro 8 June 2014 в 15:36
поделиться
myObject.description().componentsSeparatedByString(" ").first!

Это не совсем то, что вы хотите - это добавит нежелательный ведущий '<' и завершающий ':'. Но когда я отлаживаю, я ценю скорость, а не аккуратность, поэтому этот быстрый и грязный трюк сработал для меня.

0
ответ дан Rolf Hendriks 8 June 2014 в 15:36
поделиться

Вот пример 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"
1
ответ дан Rafat touqir Rafsun 8 June 2014 в 15:36
поделиться

Это немного короче. Нет необходимости NSStringFromClass

MyObject.self.description().componentsSeparatedByString(".").last!
1
ответ дан nacho4d 8 June 2014 в 15:36
поделиться

Swift 3

NSStringFromClass(self).components(separatedBy: ".").last!
0
ответ дан anoop4real 8 June 2014 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: