2017-10-03 2 views
1

Fondamentalement, je suis en utilisant KVC, et ont potentiellement différents types de valeur retournée, et que vous souhaitez créer une instruction switch en fonction du typeVous cherchez à nettoyer cette déclaration de mise hors tension d'une `Any` valeur de` valueForKeyPath`

J'ai essayé la réponse, mais ce ne serait pas compiler: Swift: Test class type in switch statement

 var value: String = "Unknown" 
     switch node.value(forKeyPath: keyPath) { 
     case let numberValue is NSNumber: 
      if numberValue == 0 { 
       value = "No" 
      } else if numberValue == 1 { 
       value = "Yes" 
      } 
     case let stringValue is String: 
      value = stringValue 
     default: 
      break 
     } 

il dit

"modèle de variable de liaison ne peut pas apparaître dans une expression"

et

"Cast de <> pour non reliés NSNumber 'échoue toujours"

Ce code fonctionne ici pour moi:

 var value: String = "Unknown" 
     let nodeValue = node.value(forKeyPath: keyPath) 
     switch nodeValue { 
     case is NSNumber: 
      if let numberValue = nodeValue as? NSNumber { 
       if numberValue == 0 { 
        value = "No" 
       } else if numberValue == 1 { 
        value = "Yes" 
       } 
      } 
     case is String: 
      if let stringValue = nodeValue as? String { 
       value = stringValue 
      } 
     default: 
      break 
     } 

mais il semble peu non-optimal que j'ai besoin d'utiliser des liaisons optionnelles pour typer une nouvelle variable

Y a-t-il une meilleure façon de faire cela?

+0

qui semble créer un autre problème, "opérateur binaire ne peut pas être appliqué à" Any? "et" NSNumber " –

+0

avant d'entrer dans le commutateur, essayez d'utiliser' guard' sur la valeur reçue de votre 'valueForKeyPath' .Après cela, vous n'aurez pas besoin de typer –

Répondre

2

Il est un moyen de correspondance de motif et jeté à la fois, et je pense qu'il est en fait assez propre:

switch nodeValue { 
case let number as NSNumber: 
    switch number { 
    case 0: value = "No" 
    case 1: value = "Yes" 
    default: break 
    } 
case let string as String: 
    value = string 
default: break 
} 
+0

'let value: Chaîne commutateur node.value (forKeyPath: keyPath) {{ cas laisser le numéro que NSNumber: value = number == 0? "Non": "Oui" cas laisser la chaîne comme Chaîne: valeur = chaîne valeur par défaut: valeur = "inconnu" } ' –

+0

@LeoDabus Totalement, tant qu'il est d'accord avec les nombres 2 et plus étant" Oui "au lieu de "Inconnu". – andyvn22

+0

On dirait un Bool donc il pourrait aussi le lancer comme un Bool –

0

Quelque chose comme cela devrait fonctionner

guard let unwrappedValue = node.value(forKeyPath: keyPath) else { 
    return 
} 

switch (unwrappedValue) { 
    case is String: 
     value = (unwrappedValue as! String) 
    case is NSNumber: 
     value = (unwrappedValue as! NSNumber) == 0 ? "YES" : "NO" 
    defualt: 
     value = "default value?" 
} 
+0

désolé, manqué que dans copier/coller. merci :) –