我有两个实体:
它们以反向关系连接,因此一个Todo对象可以有多个Dates,因此Todo具有属性:
@NSManaged var dates: NSSet?
@NSManaged var name: String?
并且每个Dates对象可以有一个Todo,因此它具有属性:
@NSManaged var todo: Todo?
@NSManaged var wasDone: NSNumber? //It is a boolean
@NSManaged var date: NSDate?
当我创建Todo时,我在实体名称中插入新对象。
//Saving into local device context
guard let ourcontext = self.context else {print("no context");return}
guard let newTodo = NSEntityDescription.insertNewObjectForEntityForName("Todo", inManagedObjectContext: ourcontext) as? Todo else {return}
let myTodoName = self.addTodoView.searchTextField.text
newTodo.name = myTodoName
然后我计算了日期,我想将它们插入到Todo的NSSet中(我在Todo中创建了一个函数:
func addObject(value: Dates) {
let dates = self.mutableSetValueForKey("dates")
dates.addObject(value)
}
所以在计算了日期并创建了它们的“datesArray”后,我想将它们添加到上面提到的NSSet中:
for _ in self.datesArray {
guard let newDate = NSEntityDescription.insertNewObjectForEntityForName("MedicineDates", inManagedObjectContext: ourContext) as? MedicineDates else {return}
newTodo.addObject(newDate)
这是第一个问题 - 我是否正确创建了对象之间的关系?
然后我想创建(在cellForRowAtIndexPath中,因为这在tableView中显示)来自Todo的NSSet的一个数组:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! TodoTableViewCell
guard let object = fetchedResultsController?.objectAtIndexPath(indexPath) as? Todo else {return cell}
NSSet to Array:
let fetchedData = object.dates?.allObjects as! [Dates]
let datesArray = [NSDate]()
for object in fetchedData {
datesArray.append(object.date!)
}
这就是热潮。当我试图解开object.date时,它告诉我“在解开一个Optional值时意外地发现了nil”,但我知道带有“Date”类型对象的fetchedData存在。
我做错了什么或者我没有做错?
答案 0 :(得分:0)
该错误表示虽然存在Dates
个对象,但date
类型的NSDate
属性却没有。
确保通过设置Dates
属性并保存上下文来正确创建date
对象。
答案 1 :(得分:0)
您可以使用类型化的Set,以便保存一些代码行:
@NSManaged var dates: Set<Dates>?
但错误表明Dates
类型的对象包含nil
属性date
。这是因为date
被定义为可选的并且尚未初始化。
您可以在数据模型中将属性date
定义为非可选项,并设置默认值。然后在你的子类中定义:
@NSManaged var date: NSDate