Swift - 从MetaType获取类名?

时间:2014-08-29 23:21:56

标签: 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 class name from type ("User")*/
    return NSEntityDescription.insertNewObjectForEntityForName(className, inManagedObjectContext: managedObjectContext) as T
}

getNewManagedObject(User.self);

4 个答案:

答案 0 :(得分:5)

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

import CoreData

@objc(User) class User : NSManagedObject {

}

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

如果没有它,NSStringFromClass将打印&#39; ModulName.ClassName&#39;这可以说比ClassName&#39;更好。只要。操场输出的丑陋是由于游乐场有一些神秘的隐含模块名称。

答案 1 :(得分:4)

通过一些实验,我发现了以下内容。在Playground你可以做到

class User : NSManagedObject {
}

let s = NSStringFromClass(User)  // cryptic output: "__lldb_expr_XX.User"

XX是一些随机数。此时,您可以使用

获取实体名称
let entityName = s.pathExtension // "User"

它有点hacky但也许它可以为你工作。

答案 2 :(得分:2)

在Swift中快速

let className = String(YourClass)

扩展变体(在我看来,它更方便)

extension NSObject {
    class var string: String{
        get {
            return String(self)
        }
    }
}

//using:
let className = YourClass.string

答案 3 :(得分:1)

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
}
相关问题