2016-08-14 94 views
0

我想访问存储在coredata内的NSDate变量作为AnyObject并打印一天。当我打印它时,它返回零。当我在打印Date后没有.day后,它会打印正确的值。 编辑:workoutDate是实体“锻炼”的属性和类型是“日期”Swift:NSDate.day返回零

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     let context: NSManagedObjectContext = appDel.managedObjectContext 

     do { 
      let request = NSFetchRequest(entityName: "Workout") 
      let results = try context.executeFetchRequest(request) 

      if results.count > 0 { 
       for item in results as! [Workout]{ 


        let time = item.valueForKey("workoutTime") 
        let currentWorkoutDate = item.valueForKey("workoutDate") 
        let workoutDateDay = currentWorkoutDate! 
        print(workoutDateDay) 
        print(workoutDateDay.day!) 

回答

2

NSDate有没有day财产。然而,键 - 值编码方法

let currentWorkoutDate = item.valueForKey("workoutDate") 

返回AnyObject?,并且可以调用任何(现有)的Objective-C方法的对象 (比较The strange behaviour of Swift's AnyObject)上。编译器不会投诉,因为dayNSDateComponents的一个属性。但是在运行时,检测到对象不响应此属性,因此 workoutDateDay.daynil

的解决方案是将值转换为NSDate对象:

if let workoutDate = item.valueForKey("workoutDate") as? NSDate { 
    // ... 
} 

或更好,创建一个子类NSManagedObject为实体 和使用属性访问。

然后使用NSCalender方法从 日获得NSDateComponents,例如

if let workoutDate = item.valueForKey("workoutDate") as? NSDate { 
    let day = NSCalendar.currentCalendar().component(.Day, fromDate: workoutDate) 
    print(day) 
    // ... 
} 
+0

谢谢你的回答。这清除了问题! –

+0

当我尝试打印日期时,出现“输入Int没有会员日”错误 –

+0

@RyanHampton:您是否准确复制了代码?这个对我有用。 'component(.Day,fromDate:workoutDate)'方法返回一个Int作为Int,你不必在返回值上访问'.day'。组件(.Day,fromDate:workoutDate)' –

1

CoreData返回NSDate不具有方法day的。 因此,如果您添加了该方法,则问题在于该方法。

+0

如果是这种情况,那么为什么它会弹出作为一个选项,当我输入后添加一个句号(期)在workoutDate? –

+0

@RyanHampton,因为它是任何类型的,但你知道它将永远是NSDate所以只是:让currentWorkoutDate = item.valueForKey(“workoutDate”)as! NSDate –

+2

@RyanHampton如果你按住ALT键并单击变量,那么Xcode会告诉你它是什么类型。然后你总是可以知道你所期望的类型是否被解释。 –