一尘不染

在Swift中获取泛型类型的名称(字符串)

swift

我有一个类型T的泛型类,我想获得实例化时传递给该类的类型的名称。这是一个例子。

class MyClass<T> {
    func genericName() -> String {
        // Return the name of T.
    }
}

我已经逛了好几个小时,但似乎找不到任何方法。有人尝试过吗?

任何帮助是极大的赞赏。

谢谢


阅读 696

收藏
2020-07-07

共1个答案

一尘不染

单纯的快速方法是不可能的。

可能的解决方法是:

class MyClass<T: AnyObject> {
    func genericName() -> String {
        let fullName: String = NSStringFromClass(T.self)
        let range = fullName.rangeOfString(".", options: .BackwardsSearch)
        if let range = range {
            return fullName.substringFromIndex(range.endIndex)
        } else {
            return fullName
        }
    }
}

这些限制取决于它仅适用于类的事实。

如果这是通用类型:

class TestClass {}

NSStringFromClass() 返回全名(包括名称空间):

// Prints something like "__lldb_expr_186.TestClass" in playground
NSStringFromClass(TestClass.self)

这就是为什么func搜索.字符的最后一次出现。

测试如下:

var x = MyClass<TestClass>()
x.genericName() // Prints "TestClass"

更新Swift 3.0

func genericName() -> String {
    let fullName: String = NSStringFromClass(T.self)
    let range = fullName.range(of: ".")
    if let range = range {
        return fullName.substring(from: range.upperBound)
    }
    return fullName
}
2020-07-07