Swift中是否有一个等效的NSStringFromClass,它提供了类名的用户可读版本?我试图将它与我创建的本机Swift类一起使用,但正如您所看到的,结果似乎是编译器的类名称的内部表示:
println(NSStringFromClass(MyClass.self))
结果:
_TtC5test7MyClass
我尝试将 @objc 属性添加到类中,并使其成为NSObject的子类,但它没有任何区别。我发现如果我用同名的Objective-C类替换MyClass,并在桥接头中导入它,它会给我' MyClass',但这不应该是必要的。
另一种选择是为此制定协议,我想以这种方式使用的每个类必须符合:
protocol Nameable {
class var className: String { get }
}
但是,使用该语言以内置方式执行此操作会更容易。
答案 0 :(得分:61)
您现在可以这样做:
String(MyClass)
答案 1 :(得分:25)
基于xcode 6 beta 5的新格式。
(PROJECT_NAME)。(CLASS_NAME)
func getName(classType:AnyClass) -> String {
let classString = NSStringFromClass(classType.self)
let range = classString.rangeOfString(".", options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start:classString.startIndex, end: classString.endIndex), locale: nil)
return classString.substringFromIndex(range!.endIndex)
}
最新6.3 Xcode Swift 1.2
如果您需要扩展名,或者您可以将其放在任何常见对象上:
public extension NSObject{
public class var nameOfClass: String{
return NSStringFromClass(self).componentsSeparatedByString(".").last!
}
public var nameOfClass: String{
return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
}
}
答案 2 :(得分:13)
Swift 3
type(of: self)
打印 ModuleName.ClassName
String(describing: type(of: self))
打印 ClassName
答案 3 :(得分:5)
目前,没有可靠的方法来做到这一点。查看Apple开发人员对https://devforums.apple.com/thread/227425
的评论斯威夫特目前没有太多的内省。有一些内省机制用于 操场。我不知道这是不是API。
一些斯威夫特 可以使用Objective-C运行时检查方法和变量 内省。这可能是今天最好的解决方案。
Swift确实具有元类型的概念,有点类似于Objective C中的Class类型。您可以使用TypeName.self
找到它,例如:
class Foo {
@required init() {
}
}
var normalFoo : Foo = Foo()
var fooType : Foo.Type = Foo.self;
var fooFromMetatype : Foo = fooType();
也许,在发布时间,元类型将包含更多的内省能力。我建议为此提交Radar功能请求。
答案 4 :(得分:5)
在Swift 2 beta 4中,您可以通过类型对象获取信息:
"runas"
或者如果你有一个实例:
let className = "\(String.self)" // gives: "Swift.String"
您获得Module.Class结果,如:
let s = "Hello World"
let className = "\(s.dynamicType)" // gives: "Swift.String"
有趣的是,返回的Type对象似乎不符合CustomStringConvertible协议。因此它没有“描述”。财产,虽然&#34;&#34;模式仍然是正确的。
P.S。:在b4之前,可以通过reflect(obj.dynamicType).summary完成同样的事情。
答案 5 :(得分:3)
在Swift v3.0中,这对我有用:
String.init(describing: self.self)
答案 6 :(得分:2)
-----更新了-----
正如@ThomasW所提到的,对于Swift 4,我们需要使用String(describing:type(of:self))
-----老帖子----
我更喜欢使用String(self.dynamicType)
答案 7 :(得分:1)
如果你想在swift中只有类的名字,你可以解析NSStringFromClass()返回的字符串。
这是在INSwift Github存储库的nameOfClass.swift中完成的: https://github.com/indieSoftware/INSwift
答案 8 :(得分:1)
您现在可以使用以下内容在swift中检索类名
let nameSpaceClassName = NSStringFromClass(RWTCountryPopoverViewController.self)
let className = nameSpaceClassName.componentsSeparatedByString(".").last! as String
答案 9 :(得分:1)
这有点短。无需NSStringFromClass
MyObject.self.description().componentsSeparatedByString(".").last!
答案 10 :(得分:1)
这是 Swift 3 +,Xcode 8 + 示例,代码为:
class MySuperbClass{
let a = 4
func getClassName() -> String? {
return String(describing: type(of:self)).components(separatedBy: ".").first
}
}
let className = String(describing: type(of:MySuperbClass.self)).components(separatedBy: ".").first
//className = "MySuperbClass"
let classNameFromObject = MySuperbClass().getClassName()
//classNameFromObject = "MySuperbClass"
答案 11 :(得分:0)
myObject.description().componentsSeparatedByString(" ").first!
这不是你想要的 - 它会添加一个不需要的前导'&lt;'和尾随':'。但是当我调试时,我重视速度而不是整洁,所以这个快速+肮脏的技巧对我有用。
答案 12 :(得分:0)
Swift 3
NSStringFromClass(self).components(separatedBy: ".").last!
答案 13 :(得分:0)
Swift 4
super.init(nibName:String(describing:MyClass.self), bundle: nil)
答案 14 :(得分:0)
在最新版本的swift中,以下对我有用:
NSStringFromClass(type(of: device!.self))