Вызов 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!