Swift - 如何从元类型中获取类名?

3
在下面的示例中,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个回答

5

Swift类可以被赋予自定义的Objective-C名称,这将使得在playground中使用NSStringFromClass打印出更好的输出。

import CoreData

@objc(User) class User : NSManagedObject {

}

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

如果没有它,在没有明确指定模块名称的情况下,NSStringFromClass将会打印出"ModulName.ClassName"而非仅为"ClassName"。游乐场输出的丑陋是因为游乐场具有一些隐晦的模块名称。


4

经过一些实验,我发现以下内容。在Playground中,您可以执行以下操作

class User : NSManagedObject {
}

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

XX是一个随机数字。此时,您可以使用以下代码获取实体名称:

let entityName = s.pathExtension // "User"

这个方法有点取巧,但或许对你有用。


谢谢,我会四处寻找是否有更好的解决方案,如果没有,我会接受这个。我确实想念Objective C运行时API。 - aryaxt
我认为如果一个类不是NSObject的子类,这种方法可能行不通,但我会尝试一下。 - aryaxt
这对我来说可行,但速度很慢。在调试器中,执行这行代码需要2到3秒钟。 - Mike Taverne
看看其他的答案。我不确定在问题提出时是否可用,但现在肯定是正确的做法。 - Frizlab
抱歉,这个答案已经过时了,我不得不选择我的答案作为正确答案 :( - aryaxt

2

Swift 中的快速排序算法:

let className = String(YourClass)

扩展变量(我认为更加方便)

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

//using:
let className = YourClass.string

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
}

3
let className = String(describing: Int.self) //StringSwift 3 解决方案:将 Int 类型的类名转换成字符串并赋值给变量 className。使用 String(describing:) 方法可以实现此功能。 - Yu-Lin Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接