【发布时间】:2017-04-15 17:48:35
【问题描述】:
我一直在为我的一个 iOS 应用程序使用 CoreData,并希望构建一个辅助函数来将 CoreData 实体的 String 表示转换为该实体的 NSManagedObject 实例。我刚刚完成了我专业的第一门 Swift 课程,根据我的理解,我认为逻辑/实现相当简单。我相信我的实现是错误的,因为 Swift 是我最新的编程语言。我试图避免对解决方案进行硬编码,因为我的直觉告诉我有更好、更通用的方法来实现我的目标。
示例(朴素伪代码):
func getEntity(from string: String) -> NSManagedObject {
return string as! NSManagedObject
}
期望的执行:
let stringRep = "Entity"
entity(from: stringRep)
Entity
上下文:
我正在使用的两个 CoreData 实体是 Category 和 Service。
public class Category: NSManagedObject { }
public class Service: NSManagedObject { }
Category 包含与许多 Service 实体的关系,而我在 AppService 中的其他辅助函数使用该关系访问 CoreData。
CategoryTableViewController 具有三个静态单元格,每个单元格都包含 String 表示 Category 的实体。
我在prepare(for segue: UIStoryboardSegue, sender: Any?) 期间将选定的String 实体(如Service)表示传递给下一个UIViewController,并带有UITableView。
使用新的辅助函数,我将能够从具有String 表示的CoreData 中模糊地获取数据,并在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)
【问题讨论】:
-
您不能这样做,因为
String和NSManagedObject不相关。而NSManagedObject不是实体。 -
我澄清了。由于语言的语义,这就是我为 Swift 编写伪代码的方式。
标签: swift string core-data nsmanagedobject nsentitydescription