Swift-从元类型获取类名?
在下面的示例中,T引用了一个扩展NSManagedObject的类型,所以为什么我不能调用它呢 我无权访问该类的实例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
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 solutionslet className=String(description:Int.self)//String