获取对象的类名为String
,使用:
object_getClassName(myViewController)
返回如下内容:
_TtC5AppName22CalendarViewController
我正在寻找纯版本:“CalendarViewController”
。我如何得到一个清理过的类名字符串呢?
我发现了一些关于这个的问题,但没有真正的答案。难道一点都不可能吗?
下面是将typeName
作为变量(同时使用值类型或引用类型)的扩展。
protocol NameDescribable {
var typeName: String { get }
static var typeName: String { get }
}
extension NameDescribable {
var typeName: String {
return String(describing: type(of: self))
}
static var typeName: String {
return String(describing: self)
}
}
如何使用:
// Extend with class/struct/enum...
extension NSObject: NameDescribable {}
extension Array: NameDescribable {}
extension UIBarStyle: NameDescribable { }
print(UITabBarController().typeName)
print(UINavigationController.typeName)
print([Int]().typeName)
print(UIBarStyle.typeName)
// Out put:
UITabBarController
UINavigationController
Array<Int>
UIBarStyle
更新至SWIFT 5
我们可以通过String
初始值设定项使用实例变量获得类型名称的漂亮描述,并创建特定类的新对象
像,例如print(String(描述:type(of:对象)))
。其中,对象可以是一个实例变量,如数组、字典、Int、NSDate等。
由于NSObject
是大多数Objective-C类层次结构的根类,因此可以尝试对NSObject
进行扩展,以获取NSObject
的每个子类的类名。这样地:
extension NSObject {
var theClassName: String {
return NSStringFromClass(type(of: self))
}
}
或者,您可以创建一个静态funcion,其参数类型为Any
(所有类型隐式符合的协议),并将类名返回为String。像这样:
class Utility{
class func classNameAsString(_ obj: Any) -> String {
//prints more readable results for dictionaries, arrays, Int, etc
return String(describing: type(of: obj))
}
}
现在你可以这样做:
class ClassOne : UIViewController{ /* some code here */ }
class ClassTwo : ClassOne{ /* some code here */ }
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Get the class name as String
let dictionary: [String: CGFloat] = [:]
let array: [Int] = []
let int = 9
let numFloat: CGFloat = 3.0
let numDouble: Double = 1.0
let classOne = ClassOne()
let classTwo: ClassTwo? = ClassTwo()
let now = NSDate()
let lbl = UILabel()
print("dictionary: [String: CGFloat] = [:] -> \(Utility.classNameAsString(dictionary))")
print("array: [Int] = [] -> \(Utility.classNameAsString(array))")
print("int = 9 -> \(Utility.classNameAsString(int))")
print("numFloat: CGFloat = 3.0 -> \(Utility.classNameAsString(numFloat))")
print("numDouble: Double = 1.0 -> \(Utility.classNameAsString(numDouble))")
print("classOne = ClassOne() -> \((ClassOne).self)") //we use the Extension
if classTwo != nil {
print("classTwo: ClassTwo? = ClassTwo() -> \(Utility.classNameAsString(classTwo!))") //now we can use a Forced-Value Expression and unwrap the value
}
print("now = Date() -> \(Utility.classNameAsString(now))")
print("lbl = UILabel() -> \(String(describing: type(of: lbl)))") // we use the String initializer directly
}
}
此外,一旦我们可以得到类名为String,我们就可以实例化该类的新对象:
// Instantiate a class from a String
print("\nInstantiate a class from a String")
let aClassName = classOne.theClassName
let aClassType = NSClassFromString(aClassName) as! NSObject.Type
let instance = aClassType.init() // we create a new object
print(String(cString: class_getName(type(of: instance))))
print(instance.self is ClassOne)
也许这对外面的人有帮助!。
实例中的字符串:
String(describing: self)
类型中的字符串:
String(describing: YourType.self)
例子:
struct Foo {
// Instance Level
var typeName: String {
return String(describing: Foo.self)
}
// Instance Level - Alternative Way
var otherTypeName: String {
let thisType = type(of: self)
return String(describing: thisType)
}
// Type Level
static var typeName: String {
return String(describing: self)
}
}
Foo().typeName // = "Foo"
Foo().otherTypeName // = "Foo"
Foo.typeName // = "Foo"
使用class
、struct
和enum
进行测试。
问题内容: 假设我以如下方式实例化Java对象: 现在,是否可以从一种类方法中获取字符串形式的var对象的名称? 其他详细信息(已编辑): 我之所以想获取持有该对象引用的变量的名称,是因为我的new变量将在页面上创建一个新的clickable ,需要调用一个函数。在插入新对象时,我需要知道持有对象引用的变量的名称。也许有更好的方法吗? 您是对的,对术语的混淆感到抱歉。 我之所以想获取持有该对象引用
问题内容: 我正在尝试检索所有联系人的姓名和电话号码,并将它们放入iOS中的Swift数组中。我到目前为止已经做到了: 完成后,将完全包含我所有联系人姓名的数组。即“ John Doe”。但是,返回一个值数组,例如 我想知道如何仅将电话号码作为字符串值即“ XXXXXXXXXX”来检索。基本上,如何调用数字值。谢谢! 问题答案: 我找到了解决方案:
如果我有一个子类,如何将类名获取为string?我试过做,但这会返回对象,而不是。
问题内容: 说我有这个PHP代码: 然后,我需要一个这样的功能: 打印: 任何想法如何实现这一目标?在PHP中甚至有可能吗? 问题答案: 您可以使用get_defined_vars()来查找与您要查找其名称的变量具有相同值的变量的名称。显然,这并不总是可行的,因为不同的变量通常具有相同的值,但这是我想到的唯一方法。 编辑:get_defined_vars()似乎不能正常工作,它返回’var’,因为
问题内容: 我正在将带有JSON正文的POST请求发送到Django服务器(相当标准)。在服务器上,我需要使用进行解码。 问题是如何获取字符串格式的请求正文? 我目前有以下代码: 但是,这给出了一个错误。 如何以正确的编码将请求的主体作为字符串检索? 问题答案: 请求主体,是一个字节字符串。在Python 3中,将仅接受unicode字符串,因此您必须先进行解码,然后再将其传递给。 在Python