当前位置: 首页 > 知识库问答 >
问题:

在Swift中以字符串形式获取对象的类名

祁奇略
2023-03-14

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

object_getClassName(myViewController)

返回如下内容:

_TtC5AppName22CalendarViewController

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

我发现了一些关于这个的问题,但没有真正的答案。难道一点都不可能吗?

共有3个答案

樊桐
2023-03-14

下面是将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
桑璞
2023-03-14

更新至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)

也许这对外面的人有帮助!。

蒋健
2023-03-14

实例中的字符串:

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"

使用classstructenum进行测试。

 类似资料:
  • 问题内容: 假设我以如下方式实例化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