在下面的示例中,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);
答案 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)
:
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
}