使用以下方法将对象的类名获取为 String
:
object_getClassName(myViewController)
返回类似于这样的内容:
_TtC5AppName22CalendarViewController
我正在寻找纯净的版本:"CalendarViewController"
。那么如何获取一个清理过的类名字符串呢?
我找到了一些关于这个问题的尝试,但没有实际的答案。难道完全不可能吗?
使用以下方法将对象的类名获取为 String
:
object_getClassName(myViewController)
返回类似于这样的内容:
_TtC5AppName22CalendarViewController
我正在寻找纯净的版本:"CalendarViewController"
。那么如何获取一个清理过的类名字符串呢?
我找到了一些关于这个问题的尝试,但没有实际的答案。难道完全不可能吗?
reflect().summary
。在获取dynamicType之前,请解开可选项,否则dynamicType是可选项包装器。class SampleClass { class InnerClass{} }
let sampleClassName = reflect(SampleClass.self).summary;
let instance = SampleClass();
let instanceClassName = reflect(instance.dynamicType).summary;
let innerInstance = SampleClass.InnerClass();
let InnerInstanceClassName = reflect(innerInstance.dynamicType).summary.pathExtension;
let tupleArray = [(Int,[String:Int])]();
let tupleArrayTypeName = reflect(tupleArray.dynamicType).summary;
这里描述了一个包含泛型的类路径摘要。如果想从摘要中获取简单的类名,可以尝试使用以下方法。
func simpleClassName( complexClassName:String ) -> String {
var result = complexClassName;
var range = result.rangeOfString( "<" );
if ( nil != range ) { result = result.substringToIndex( range!.startIndex ); }
range = result.rangeOfString( "." );
if ( nil != range ) { result = result.pathExtension; }
return result;
}
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
extension NSObject {
class var className: String {
return "\(self)"
}
}
Swift 5
NSStringFromClass(CustomClass.self)
这个解决方案适用于所有类
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
}
在 macOS 10.10 及更高版本中,可以从 className 获取 Swift 3.0 版本。
self.className.components(separatedBy: ".").last!
NSObject
上的实例方法 https://developer.apple.com/reference/objectivec/nsobject/1411337-classname - shimSwift 5.1 :-
您也可以使用通用函数将对象的类名作为字符串获取。
struct GenericFunctions {
static func className<T>(_ name: T) -> String {
return "\(name)"
}
}
使用以下方式调用此函数:
let name = GenericFunctions.className(ViewController.self)
愉快的编码 :)
@objc(CalendarViewController) class CalendarViewController : UIViewController {
// ...
}
然而,从长远来看,学习解析混淆名称会更好。其格式是标准的和有意义的,并且不会改变。
String(cString: object_getClassName(Any!))
在Xcode中⌘点击函数可以查看一些相关的方法,这些方法非常有用。或者在此处检查https://developer.apple.com/reference/objectivec/objective_c_functions。