2016-10-19 2 views
1

J'ai un objet NSManagedObject avec:Pourquoi `comme Date` est-il requis pour` timeIntervalSince() `avec deux objets` NSDate`?

@NSManaged public var timestamp: NSDate 

je avais besoin l'intervalle de temps entre deux d'entre eux, donc je mis en œuvre:

let interval = next.timestamp.timeIntervalSince(current.timestamp) 

Pourquoi ce résultat dans l'erreur suivante?

'NSDate' is not implicitly convertible to 'Date'; did you mean to use 
'as' to explicitly convert? 

Je suis surpris parce que les deux next et current sont de type NSDate et timeIntervalSince() est une méthode NSDate.

Il est facilement fixé en suivant la suggestion dans l'erreur, mais je voudrais comprendre ce qui se passe ici:

let interval = next.timestamp.timeIntervalSince(current.timestamp as Date) 

Dans le cas où il importe, c'est sur Swift 3.0.

Répondre

1

Se référant à NSDate Apple Documentation:

La superposition Swift au cadre Fondation fournit la structure date , qui relie à la classe NSDate. Le type de valeur Date offre les mêmes fonctionnalités que le type de référence NSDate, et les codes deux peuvent être utilisés de manière interchangeable dans le code Swift qui interagit avec les API Objective-C . Ce comportement est similaire à la façon dont Swift relie les types de chaînes, numériques et de collection aux classes de base correspondantes.

Si vous cochez la signature de la méthode timeIntervalSince, il est func timeIntervalSince(_ anotherDate: Date) -> TimeInterval, notez que anotherDate type de date est Date (pas NSDate plus).

Pour plus d'informations sur les nouveaux types de valeur, vérifiez this proposal de types valeur mutabilité et de fondation, il y a un tas de nouveaux types de valeur tels que: NSData, NSMutableData ->données, NSIndexPath ->indexPath, NSNotification - >Notification ...