web-dev-qa-db-fra.com

Convertir NSDate en Date

c'est peut-être une question stupide, mais je ne peux pas trouver l'information. J'utilise CoreData dans mon application et j'enregistre un tableau de structures. Le problème est que lorsque je récupère et essaie de le restaurer dans le tableau struct, j'ai un problème avec ma variable Date; Je ne peux pas trouver un moyen de le convertir de NSDate à Date, j'essaie d'utiliser as Date, mais cela me force à être baissé et je ne suis pas sûr que ce soit sûr. Est-ce correct? ou y a-t-il un autre moyen? 

Ceci est mon Struc: 

struct MyData {
        var value = Int()
        var date = Date()
        var take = Int()
        var commnt = String()
    }

Voici comment je vais chercher les données: 

func fetchRequestInfo() -> [MyData] {

        let fetchRequest: NSFetchRequest<GlucoseEvents> = GlucoseEvents.fetchRequest()

        do {
            let searchResults = try DatabaseController.getContext().fetch(fetchRequest)

            for result in searchResults as [GlucoseEvents] {
               let value = Int(result.value)
               let date = result.date as Date
               let take = Int(result.take)
               let commnt = String(describing: result.commnt)
                let data = MyData(value: value, date: date, take: take, commnt: commnt)
               self.dataArray.append(data)
                }



            } catch {

                print ("error: \(error)")

            }
        let orderArray = self.dataArray.sorted(by: { $0.date.compare($1.date) == .orderedAscending})
        return orderArray
    }

Et voici comment je définis les propriétés de mon CoreDataClass:

@NSManaged public var commnt: String?
    @NSManaged public var date: NSDate?
    @NSManaged public var value: Int16
    @NSManaged public var take: Int16
6
Enrique

result.date est un optionnel NSDate, vous pouvez donc le rapprocherun optionnel Date:

result.date as Date?

Utilisez ensuite la reliure facultative pour le dérouler en toute sécurité. Dans votre cas cela Pourrait être

guard let date = result.date as Date? else {
    // date is nil, ignore this entry:
    continue
}

Vous voudrez peut-être aussi remplacer

let commnt = String(describing: result.commnt)

avec

guard let commnt = result.commnt else {
    // commnt is nil, ignore this entry:
    continue
}

sinon, vous obtiendrez des chaînes de commentaires telles que Optional(My comment).

( Règle de base: String(describing: ...) n’est presque jamais ce que vous voulez, même si le compilateur le suggère pour que le code soit compilé.)

8
Martin R

Il suffit de faire un casting implicite comme:

let nsdate = NSDate() 
let date = nsdate as Date
1
evya

Vous pouvez utiliser une fonction ou juste une extension:

let nsDate = NSDate() 
let date = Date(timeIntervalSinceReferenceDate: nsDate.timeIntervalSinceReferenceDate)
0
Avi Levin