2017-09-26 1 views
0

Voici un code simple. Comment définir une valeur par défaut si quelque chose ne va pas?Traitement des erreurs dans swift - pas de paramètres ou de paramètres erronés

enum direction { 
    case north, west, east, south 
} 

let defaultDirection = direction.north 

func printDirection(parameters: [Any]) { 

    let dir = parameters[0] as! direction 
    //if error then dir = defaultDirection 

    switch dir { 
     case .north: print("north") 
     case .east: print("east") 
     case .west: print("west") 
     case .south: print("south") 
    } 
} 

printDirection(parameters: [direction.east]) 

Par exemple, si je l'appelle sans paramètres printDirection(parameters: []) ou si je stocke pas une valeur de type direction printDirection(parameters: [7])

+0

ce que vous attendez en fonction printDirection? Seulement imprimer les directions? –

+0

Pourquoi les paramètres sont-ils un tableau de 'Any' plutôt qu'un tableau de' direction'? – Michael

+0

C'est tout parce que je veux passer d'autres paramètres avec des types différents. Ici, c'est juste un exemple. – Anton

Répondre

1

Swift, vous ne pouvez pas attraper des erreurs si la méthode ne porte pas de throws. Par conséquent, vous devez vérifier chacun d'entre eux (longueur de tableau, cast) avec des instructions if.

let dir: direction 
if let firstParameter = parameter.first? as? direction { 
    dir = firstParameter 
} else { 
    dir = defaultDirection 
} 
1

Eh bien, si vous êtes force coulée comme Direction un élément qui est pas un Direction alors vous aurez certainement une erreur à un moment donné.

Le code:

let dir = parameters[0] as! Direction 

est certainement pas une bonne idée ici.

Qu'est-ce que vous pourriez faire à la place de la force de coulée, est la construction de votre objet en utilisant l'rawValue, et en prenant soin de l'affaire lorsque votre élément n'existe pas pour qu'il ne retourne pas nil (qui est le comportement par défaut).

que vous avez un ENUM de fruits:

enum Fruit: String { 

    case apple = "apple" 
    case banana = "banana" 
    case mango = "mango" 
    case cherry = "cherry" 

    init(rawValue: String) { 

     switch rawValue { 
     case "apple" : self = .apple 
     case "banana" : self = .banana 
     case "mango" : self = .mango 
     case "cherry" : self = .cherry 
     default: self = .apple 
     } 

    } 

} 

Comme vous pouvez ici j'utiliser le mon ENUM init pour revenir « pomme » de toute façon à chaque fois que la valeur est quelque chose que je veux.

Et maintenant, vous pouvez faire:

let fruit = Fruit(rawValue: "pear") 

print(fruit) // Prints "apple" because "pear" is not one of the fruits that I defined in my enum. 

let otherFruit = Fruit(rawValue: "banana") 

print(otherFruit) // Prints "banana" 

Et bien sûr, vous pouvez l'utiliser dans votre fonction de manière similaire :)

Note: S'il vous plaît noter que vous auriez encore pour gérer le cas lorsque votre nom de fruit est nil (ou tout autre type qui n'est pas une chaîne) parce que le rawValuene faut être un String. Vous pouvez utiliser une instruction if ou a guard pour vérifier si c'est un String ou pas avant d'essayer de construire votre fruit en utilisant le rawValue.

0

Je pense que le meilleur est:

let dir = (parameters.count >= 1 && parameters[0] as? direction != nil) ? parameters[0] as! direction : defaultDirection