在swift中获取用户可读的类名(在objc NSStringFromClass中很好)

时间:2014-06-08 15:25:13

标签: cocoa-touch swift

Swift中是否有一个等效的NSStringFromClass,它提供了类名的用户可读版本?我试图将它与我创建的本机Swift类一起使用,但正如您所看到的,结果似乎是编译器的类名称的内部表示:

println(NSStringFromClass(MyClass.self))

结果:

_TtC5test7MyClass

我尝试将 @objc 属性添加到类中,并使其成为NSObject的子类,但它没有任何区别。我发现如果我用同名的Objective-C类替换MyClass,并在桥接头中导入它,它会给我' MyClass',但这不应该是必要的。

另一种选择是为此制定协议,我想以这种方式使用的每个类必须符合:

protocol Nameable {
    class var className: String { get }
}

但是,使用该语言以内置方式执行此操作会更容易。

15 个答案:

答案 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)

在我的项目https://github.com/JakeLin/SwiftWeather/blob/e7165b0919dda53fd7fcba9b43fdfe150d73c6f8/SwiftWeather/ForecastView.swift#L135

中使用它

答案 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))