2017-04-15 53 views
0

我一直在使用CoreData來處理iOS應用程序,並希望構建幫助函數以將CoreData實體的String表示形式變爲該實體的NSManagedObject實例。我剛剛完成了我的第一個Swift課程,根據我的理解,我假設邏輯/實現非常簡單。我相信我的實現是錯誤的,因爲Swift是我最新的編程語言。我試圖避免對解決方案進行硬編碼,因爲我的直覺告訴我有更好,更一般的方法來實現我的目標。CoreData:將字符串轉換爲NSManagedObject實例

例(樸素的僞代碼):

func getEntity(from string: String) -> NSManagedObject { 
    return string as! NSManagedObject 
} 

期望的執行:

let stringRep = "Entity" 
entity(from: stringRep) 

Entity

語境:

我一起工作的CoreData實體中有兩個是CategoryService

public class Category: NSManagedObject { } 
public class Service: NSManagedObject { } 

Category包含許多Service實體的關係,並在AppService訪問CoreData使用關係我的其他輔助功能。

CategoryTableViewController有三個靜態單元格,每個靜態單元格包含Category的實體的String表示形式。

我期間prepare(for segue: UIStoryboardSegue, sender: Any?)傳遞一個實體的所選String表示如Service到下一UIViewControllerUITableView

使用新的幫助函數,我將能夠從CoreData中以String表示形式不明確地獲取數據,並在UITableView中顯示數據。

我的最終目標是用下面的函數刪除AppService中的不必要的函數。

func get(_ entities: String, for category: Category) -> NSFetchedResultsController<T> { 
    let someEntity = getEntity(from: entities) 
    let fetchRequest: NSFetchRequest<someEntity> = someEntity.fetchRequest() 
    fetchRequest.predicate = NSPredicate(format: "category == %@", category) 
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)] 

    return createFetchedResultsController(for: fetchRequest) 
} 

例子:

get("Service", for: category) 
+0

你不能這樣做,因爲'String'和'NSManagedObject'是沒有關係的。而'NSManagedObject'不是一個實體。 – vadian

+0

我澄清了它。這就是我爲Swift編寫僞代碼的原因,因爲語言的語義。 –

回答

1

您可以創建基於實體名稱的某個實體的新對象。一如既往,您將需要您的託管對象上下文。

首先,你必須得到NSEntityDescription

let entity = NSEntityDescription.entity(forEntityName: "Widget", in: context) 

然後你就可以創建對象:

let newWidget = NSManagedObject(entity: entity, in: context) 

然而,這將是更好的使用該子類。它自動包含實體信息。

let newWidget = Widget(context: context) // much easier 
+0

謝謝,這有助於很多!文檔對'NSEntityDescription'和如何使用它有點模糊。它應該完全適合我的'AppService'。 –

0

這樣做是不可能的......

1,假設有一個實體名稱爲「人」,因爲你有一個屬性是「名」

2,具有NSManagedObject像xx12145ac通過獲取查詢 OR 創建一個新的NSManagedobject人

3,一旦你有型的人是對象,那麼你可以設置

myPersonObj.name =「某人」的!字符串

我希望這將幫助你!

不要讓我知道,如果你面對任何問題.. :)