在Objective-C中的Swift类上调用NSStringFromClass会返回模块损坏的名称

时间:2014-11-14 09:46:24

标签: ios objective-c swift xcode6

我知道this question关于如何在Swift中获得Objective-c类的可读类名。

我想要实现的是从objective-c中获取Swift类的可读类名,而不使用模块修改类名。

所以如果我有一个Swift类:

class Foo: NSObject{}

然后在Objective-C中,我很乐意使用方便的NSStringFromClass将类名转换为字符串。

我希望NSStringFromClass([Foo class])返回@"Foo",而是返回@"Bar.Foo",其中Bar是模块名称。

我遇到了这个Gist,但它看起来有点乱和乱,是否有更好的方法?不包括手动将类名输入字符串的内容是首选。

8 个答案:

答案 0 :(得分:29)

在SWIFT 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代码测试过这个。


有一个编辑建议想要使用它来代替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!