我知道this question关于如何在Swift中获得Objective-c类的可读类名。
我想要实现的是从objective-c中获取Swift类的可读类名,而不使用模块修改类名。
所以如果我有一个Swift类:
class Foo: NSObject{}
然后在Objective-C中,我很乐意使用方便的NSStringFromClass将类名转换为字符串。
我希望NSStringFromClass([Foo class])
返回@"Foo"
,而是返回@"Bar.Foo"
,其中Bar
是模块名称。
我遇到了这个Gist,但它看起来有点乱和乱,是否有更好的方法?不包括手动将类名输入字符串的内容是首选。
答案 0 :(得分:29)
只需将@objc(YourClassName)
放入您的快速课程中:
@objc(YourClassName)
class YourClassName: NSObject {
}
你可以像这样使用NSStringFromClass:
NSStringFromClass(YourClassName.self)
它也应该来自Objective-C。
对于Swift 2.1,对此答案的评论表明这已足够:
class YourClassName: NSObject {
}
只需使用:
var str = String(YourClassName)
我自己没有用Objective-C代码测试过这个。
有一个编辑建议想要使用它来代替Swift 4:
var str = String(describing: YourClassName.self)
我还没有从Objective-C测试过这个。
答案 1 :(得分:9)
获得"Bar.Foo"
的原因是因为swift是命名空间语言。我假设您运行此应用程序的应用程序名为Bar。因此,您可以使用以下内容获取您的班级名称:
let nameSpaceClassName = NSStringFromClass(Foo)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String
答案 2 :(得分:3)
在Objective-C中,您最好的选择是:
NSString *yourCellName = NSStringFromClass([yourCell class]).pathExtension;
答案 3 :(得分:2)
Swift 2.1中的工作解决方案是
String(MyClass)
答案 4 :(得分:0)
Swift 5.1解决方案,用于 NSStringFromClass
如果您想要类名的字符串描述(例如CustomTableViewCell
),请使用:
String(describing: CustomTableViewCell.self)
答案 5 :(得分:0)
在以下最新的Swift上为我工作:
NSStringFromClass(type(of: yourClass!.self))
答案 6 :(得分:-1)
Swift 5.1
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if String(describing: touch.view!.classForCoder) == "UITableViewCellContentView" {
return false
} else {
return true
}
}
答案 7 :(得分:-2)
使用Swift 2.0尝试:
self.description().componentsSeparatedByString(".").last!