2014-08-29 85 views
2

在下面的例子中,T指的是擴展NSManagedObject的類型,爲什麼我不能調用。Swift - 從MetaType獲取類名?

我沒有訪問類的實例

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); 

回答

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 
} 
+1

斯威夫特3解決方案 'let className = String(describe:Int.self)// String' – 2016-11-27 02:59:51

3

有了一些嘗試,我發現了以下內容。在遊樂場你可以做

class User : NSManagedObject { 
} 

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

XX是一些隨機數字。在這一點上,你可以得到的實體名稱與

let entityName = s.pathExtension // "User" 

這有點hacky,但也許它可以爲你工作。

+0

謝謝,我會環顧四周,看看是否有更好的解決方案,如果沒有,我會接受。我肯定會錯過客觀的C運行時API – aryaxt 2014-08-30 00:12:49

+0

我不認爲這將工作,如果一個類不是NSObject的子類,將試試 – aryaxt 2014-08-30 00:23:02

+0

@aryaxt:Nope。任何班級都可以工作。 – newacct 2014-08-30 01:22:58

5

Swift類可以給定一個自定義的Objective-C名稱,NSStringFromClass會在操場上打印出更好的輸出。

import CoreData 

@objc(User) class User : NSManagedObject { 

} 

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

沒有它,NSStringFromClass將打印「ModulName.ClassName」,這可以說是不是隻「類名」更好。操場輸出的醜陋是由於遊樂場有一些隱含的模塊名稱。

2

快速斯威夫特:

let className = String(YourClass) 

擴展變種(在我看來,它更方便)

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

//using: 
let className = YourClass.string