Вызов NSStringFromClass в Swift Class в Objective-C возвращает имя с измененным модулем

Я знаю этот вопрос относительно того, как мы можем получить читаемое имя класса класса objective-c в Swift.

То, что я хочу достичь, - получить читаемое имя класса Swift изнутри objective-c без изменения имени класса с помощью модуля.

Итак, если у меня есть класс Swift:

class Foo: NSObject{}

Затем внутри objective-c я хотел бы использовать удобный NSStringFromClass для преобразования имени класса в строку.

Я ожидаю, что NSStringFromClass([Foo class]) вернет @"Foo", но вместо этого возвращает @"Bar.Foo" с Bar, являющимся именем модуля.

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

Ответ 1

ПЕРЕД ПЕРВЫМ 2.1:

Просто введите @objc(YourClassName) в свой класс:

@objc(YourClassName)

class YourClassName: NSObject {

}

И вы можете использовать NSStringFromClass следующим образом:

NSStringFromClass(YourClassName.self)

Он также должен работать от Objective-C.


SWIFT 2.1

С Swift 2.1 комментарий к этому ответу гласит, что этого достаточно:

class YourClassName: NSObject {

}

И просто используйте:

var str = String(YourClassName)

Я не тестировал это из кода Objective-C сам.

Ответ 2

Причина, по которой вы получаете "Bar.Foo", - это то, что swift - это язык пространства имен. Я предполагаю, что приложение, которым вы управляли этим, было указано как Bar. Следовательно, вы можете получить свое имя класса, используя следующее:

let nameSpaceClassName = NSStringFromClass(Foo)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String

Ответ 3

Рабочим решением для этого в Swift 2.1 является

String(MyClass)

Ответ 4

Попробуйте с Swift 2.0:

self.description().componentsSeparatedByString(".").last!