Swift-从元类型获取类名?

Swift-从元类型获取类名?,swift,Swift,在下面的示例中,T引用了一个扩展NSManagedObject的类型,所以为什么我不能调用它呢 我无权访问该类的实例 private func getNewManagedObject <T: NSManagedObject>(type: T.Type) -> T { // Let's assume all Entity Names are the same as Class names let className = "" /*Somehow get clas

在下面的示例中,T引用了一个扩展NSManagedObject的类型,所以为什么我不能调用它呢

我无权访问该类的实例

private func getNewManagedObject <T: NSManagedObject>(type: T.Type) -> T {

    // Let's assume all Entity Names are the same as Class names
    let className = "" /*Somehow get class name from type ("User")*/
    return NSEntityDescription.insertNewObjectForEntityForName(className, inManagedObjectContext: managedObjectContext) as T
}

getNewManagedObject(User.self);
private func getNewManagedObject(类型:T.type)->T{
//让我们假设所有实体名称都与类名相同
让className=”“/*以某种方式从类型(“用户”)获取类名*/
将NSEntityDescription.insertNewObjectForEntityForName(类名,inManagedObjectContext:managedObjectContext)返回为T
}
getNewManagedObject(User.self);

通过一些实验,我发现了以下几点。在操场上你能做什么

class User : NSManagedObject {
}

let s = NSStringFromClass(User)  // cryptic output: "__lldb_expr_XX.User"
XX
是一个随机数。此时,您可以使用

let entityName = s.pathExtension // "User"

这有点粗糙,但也许对你有用

Swift类可以指定一个自定义的Objective-C名称,这将使
NSStringFromClass
在操场上打印出更好的输出

import CoreData

@objc(User) class User : NSManagedObject {

}

let className = NSStringFromClass(User.self) // className will be "User" 

没有它,
NSStringFromClass
将打印“moduleName.ClassName”,这可以说比只打印“ClassName”要好。游乐场输出的丑陋是由于游乐场有一些神秘的隐式模块名

快速使用Swift:

let className = String(YourClass)
extension NSObject {
    class var string: String{
        get {
            return String(self)
        }
    }
}

//using:
let className = YourClass.string
扩展变量(我认为更方便)

let className = String(YourClass)
extension NSObject {
    class var string: String{
        get {
            return String(self)
        }
    }
}

//using:
let className = YourClass.string
Switf 2解决方案

let className = String(Int.self) // String

let className2 = String(4.dynamicType) // Int

func doThings<T>(type: T.Type) -> String {
    return String(T) // Whatever type passed
}
let className=String(Int.self)//String
让className2=String(4.dynamicType)//Int
func doThings(类型:T.type)->字符串{
返回字符串(T)//传递的任何类型
}

谢谢,我会四处看看是否有更好的解决方案,如果没有,我会接受。我肯定错过了objective C运行时API。如果一个类不是NSObject的子类,我认为这是行不通的。这对我来说是可行的,但速度很慢。在调试器中,执行这行代码需要2或3秒。请检查其他答案。我不确定问题提出时它是否可用,但现在它肯定是正确的。很抱歉,此答案已过时,必须选择我自己的答案作为正确答案:(Swift 3 solutions
let className=String(description:Int.self)//String