39 votes

Une fonction générique étrange apparaît dans le contrôleur de vue après avoir été converti en swift 3.

Dans mon projet, après avoir été converti en swift 3, une nouvelle fonction est apparue avant mon ViewController classe :

fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
   switch (lhs, rhs) {
  case let (l?, r?):
    return l < r
  case (nil, _?):
    return true
  default:
    return false
  }
}

Que fait cette fonction ? Pourquoi en ai-je besoin ?

45voto

Martin R Points 105727

C'est intéressant. Avant le dernier Swift 3, vous pouviez comparer en option valeurs, par exemple

let a: Int? = nil
let b: Int? = 4

print(a < b) // true

et nil a été considéré comme inférieur à toutes les valeurs non optionnelles.

Cette fonctionnalité a été supprimée ( SE-0121 - Suppression des opérateurs de comparaison facultatifs ) et le code ci-dessus échouerait à compiler dans Xcode 8 beta 6 avec

error: value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

Apparemment, le migrateur Swift résout ce problème pour vous en fournissant un < qui prend deux opérandes optionnels et donc "rétablit" l'ancien comportement.

Si vous supprimez cette définition, vous devriez alors voir où la comparaison est faite dans votre code. Essayez ensuite de mettre à jour votre code et de supprimer les comparaisons facultatives.

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