获取对象的类名为String,使用:

object_getClassName(myViewController)

返回如下内容:

_TtC5AppName22CalendarViewController

我正在寻找纯粹的版本:“CalendarViewController”。我如何得到一个清理类名字符串代替?

我发现了一些关于这个问题的尝试,但没有一个实际的答案。难道根本不可能吗?


当前回答

你可以在Swift 4中像这样扩展NSObjectProtocol:

import Foundation

extension NSObjectProtocol {

    var className: String {
        return String(describing: Self.self)
    }
}

这将使计算变量className对所有类可用。在CalendarViewController中的print()中使用这个将在控制台中打印“CalendarViewController”。

其他回答

要从对象中获取Swift类的名称,例如var object: SomeClass(),使用

String(describing: type(of: object))

要从类类型中获取Swift类的名称,例如SomeClass,使用:

String(describing: SomeClass.self)

输出:

" SomeClass "

你可以试试这种方法:

self.classForCoder.description()

以上的解决方案对我不起作用。产生的主要问题在几个评论中提到:

MyAppName。类名称

or

MyFrameWorkName。类名称

这个解决方案适用于XCode 9, Swift 3.0:

我把它命名为classnamecinclined,这样更容易访问,也不会与未来的className()更改冲突:

extension NSObject {

static var classNameCleaned : String {

    let className = self.className()
    if className.contains(".") {
        let namesArray = className.components(separatedBy: ".")
        return namesArray.last ?? className
    } else {
        return self.className()
    }

}

}

用法:

NSViewController.classNameCleaned
MyCustomClass.classNameCleaned

这个解决方案适用于所有的类

Swift 5解决方案:

extension NSObject {
  var className: String {
    return String(describing: type(of: self))
  }

  class var className: String {
    return String(describing: self)
  }
}

用法:

class TextFieldCell: UITableVIewCell {
}

class LoginViewController: UIViewController {
  let cellClassName = TextFieldCell.className
}

斯威夫特5.2:

String(describing: type(of: self))