获取对象的类名为String,使用:
object_getClassName(myViewController)
返回如下内容:
_TtC5AppName22CalendarViewController
我正在寻找纯粹的版本:“CalendarViewController”。我如何得到一个清理类名字符串代替?
我发现了一些关于这个问题的尝试,但没有一个实际的答案。难道根本不可能吗?
获取对象的类名为String,使用:
object_getClassName(myViewController)
返回如下内容:
_TtC5AppName22CalendarViewController
我正在寻找纯粹的版本:“CalendarViewController”。我如何得到一个清理类名字符串代替?
我发现了一些关于这个问题的尝试,但没有一个实际的答案。难道根本不可能吗?
当前回答
斯威夫特3.0: 你可以创建一个像这样的扩展..它返回的是类名,而不是项目名
extension NSObject {
var className: String {
return NSStringFromClass(self as! AnyClass).components(separatedBy: ".").last ?? ""
}
public class var className: String {
return NSStringFromClass(self).components(separatedBy: ".").last ?? ""
}
}
其他回答
要在Swift 4中获得类型名为字符串(我没有检查早期版本),只需使用字符串插值:
"\(type(of: myViewController))"
你可以在类型本身上使用.self,在实例上使用type(of:_)函数:
// Both constants will have "UIViewController" as their value
let stringFromType = "\(UIViewController.self)"
let stringFromInstance = "\(type(of: UIViewController()))"
以上的解决方案对我不起作用。产生的主要问题在几个评论中提到:
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
斯威夫特5:
方式1:
print("Class: \(String(describing: self)), Function: \(#function), line: \(#line)")
输出:
Class: <Test.ViewController: 0x7ffaabc0a3d0>, Function: viewDidLoad(), line: 15
方式2:
print("Class: \(String(describing: type(of: self))), Function: \(#function), line: \(#line)")
输出:
Class: ViewController, Function: viewDidLoad(), line: 16
斯威夫特5.1
你可以通过Self.self获取类、结构、枚举、协议和NSObject名称。
print("\(Self.self)")
如果你不喜欢这个乱七八糟的名字,你可以口述你自己的名字:
@objc(CalendarViewController) class CalendarViewController : UIViewController {
// ...
}
然而,从长远来看,最好是学会解析这个混乱的名称。格式是标准的、有意义的,不会改变。