100 votes

Swift 3 - Comparaison de l'objet Date

Je suis à jour de mes applications sur Swift 3.0 syntaxe (je sais que c'est encore en version bêta, mais je veux être prêt dès qu'il est publié).

Jusqu'à ce que la précédente Bêta de Xcode (Beta 5) j'ai pu comparer les deux Date objets en utilisant les opérandes <, > et ==. Mais dans la dernière version bêta (Bêta 6) ce n'est pas de travail, pas plus. Voici quelques captures d'écran:

enter image description here enter image description here

Comme vous pouvez le voir dans les deux captures d'écran, ce sont deux Date objets. Mais j'obtiens l'erreur suivante: enter image description here

Ce que je fais mal? Les fonctions sont encore déclarés dans l' Date classe:

static func >(Date, Date)

Retourne true si la main gauche la Date la plus éloignée dans le temps que la main droite de la Date.

Est-ce juste une Beta bug ou ai-je fait quelque chose de mal?

171voto

Ankit Thakur Points 1442

J'ai essayé de cet extrait dans XCode beta 8 6, et il fonctionne très bien.

let date1 = Date()
let date2 = Date().addingTimeInterval(100)

if date1 == date2
{
}
else if date1 > date2
{
}
else if date1 < date2
{
}

53voto

Mobile Dan Points 11

Date est Comparable & Equatable (Swift 3)

Cette réponse complète @Ankit Thakur de réponse.

Depuis Swift 3 Date struct (basé sur le sous-jacent NSDate de la classe) adopte, à l' Comparable et Equatable des protocoles.

  • Comparable nécessite qu' Date mettre en œuvre les opérateurs: <, <=, >, >=.
  • Equatable nécessite qu' Date mettre en œuvre l' == de l'opérateur.
  • Equatable permet Date pour utiliser la valeur par défaut de mise en œuvre de l' != de l'opérateur (qui est l'inverse de l' Equatable == opérateur de mise en œuvre).

L'exemple de code suivant des exercices de ces opérateurs de comparaison et qui confirme les comparaisons sont remplies avec de l' print des déclarations.

Fonction de comparaison

import Foundation

func describeComparison(date1: Date, date2: Date) -> String {

    var descriptionArray: [String] = []

    if date1 < date2 {
        descriptionArray.append("date1 < date2")
    }

    if date1 <= date2 {
        descriptionArray.append("date1 <= date2")
    }

    if date1 > date2 {
        descriptionArray.append("date1 > date2")
    }

    if date1 >= date2 {
        descriptionArray.append("date1 >= date2")
    }

    if date1 == date2 {
        descriptionArray.append("date1 == date2")
    }

    if date1 != date2 {
        descriptionArray.append("date1 != date2")
    }

    return descriptionArray.joined(separator: ",  ")
}

Exemple D'Utilisation

let now = Date()

describeComparison(date1: now, date2: now.addingTimeInterval(1))
// date1 < date2,  date1 <= date2,  date1 != date2

describeComparison(date1: now, date2: now.addingTimeInterval(-1))
// date1 > date2,  date1 >= date2,  date1 != date2

describeComparison(date1: now, date2: now)
// date1 <= date2,  date1 >= date2,  date1 == date2

32voto

Suhit Patil Points 6334

de Swift 3 et au-dessus, la Date est Comparable, de sorte que nous pouvons comparer directement les dates comme

let date1 = Date()
let date2 = Date()

let isGreater = date1 > date2
print(isGreater)

let isSmaller = date1 < date2
print(isSmaller)

let isEqual = date1 == date2
print(isEqual)

Sinon, Nous pouvons créer une extension de la Date de

extension Date {

  func isEqualTo(_ date: Date) -> Bool {
    return self == date
  }

  func isGreaterThan(_ date: Date) -> Bool {
     return self > date
  }

  func isSmallerThan(_ date: Date) -> Bool {
     return self < date
  }
}

Utilisation: let isEqual = date1.isEqualTo(date2)

17voto

Look de ce http://iswift.org/cookbook/compare-2-dates

Dates:

// Get current date
let dateA = NSDate()

// Get a later date (after a couple of milliseconds)
let dateB = NSDate()

À l'aide de l'Instruction SWITCH

// Compare them
switch dateA.compare(dateB) {
    case .OrderedAscending     :   print("Date A is earlier than date B")
    case .OrderedDescending    :   print("Date A is later than date B")
    case .OrderedSame          :   print("The two dates are the same")
}

SI l'Instruction à l'aide de

 if datePickerTo.date.compare(datePicker.date) == .orderedAscending {
     datePickerTo.date = datePicker.date
 }

9voto

Pour moi le problème était que j'avais ma propre extension à la classe Date qui a été la définition de comparer tous les opérateurs. Maintenant (depuis swift 3) cette Date est comparable, ces extensions ne sont pas nécessaires. J'ai donc commenté et cela a fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X