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

Dan*_*sko 10 objective-c ios swift xcode6

我知道这个问题,关于我们如何能够得到斯威夫特的Objective-C类的可读类名.

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

所以,如果我有一个Swift类:

class Foo: NSObject{}
Run Code Online (Sandbox Code Playgroud)

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

我希望NSStringFromClass([Foo class])返回,@"Foo"但它返回@"Bar.Foo"Bar模块名称.

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

ull*_*trm 30

在SWIFT 2.1之前:

只需@objc(YourClassName)加入你的快速课程:

@objc(YourClassName)

class YourClassName: NSObject {

}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用NSStringFromClass:

NSStringFromClass(YourClassName.self)
Run Code Online (Sandbox Code Playgroud)

它也应该来自Objective-C.


SWIFT 2.1

使用Swift 2.1对此答案的评论表明这已足够:

class YourClassName: NSObject {

}
Run Code Online (Sandbox Code Playgroud)

并且只需使用:

var str = String(YourClassName)
Run Code Online (Sandbox Code Playgroud)

我自己没有用Objective-C代码测试过这个.


有一个编辑建议想要使用它代替Swift 4:

var str = String(describing: YourClassName.self)
Run Code Online (Sandbox Code Playgroud)

我没有从Objective-C测试过这个.

  • 回答的问题是:"然后在Objective-C中,我希望使用方便的NSStringFromClass将类名转换为字符串." 所以它与Objective-C有关. (3认同)

The*_*Art 9

你得到的原因"Bar.Foo"是因为swift是命名空间语言.我假设您运行的应用程序名为Bar.因此,您可以使用以下方法获取您的班级名称:

let nameSpaceClassName = NSStringFromClass(Foo)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String
Run Code Online (Sandbox Code Playgroud)

  • 或者,也可以调用nameSpaceClassName.pathExtension来获取类名,但我仍然更喜欢接受的答案:) (2认同)

osk*_*rko 6

在objective-c中你最好的选择是:

NSString *yourCellName = NSStringFromClass([yourCell class]).pathExtension;
Run Code Online (Sandbox Code Playgroud)