2017-10-06 6 views
1

J'ai un tableau de chaînes qui doit être converti en un tableau d'entiers. Dans l'instruction For Case ci-dessus, nous effectuons une correspondance de modèle avec des valeurs optionnelles dans le tableau [Int?]. Ma compréhension du concept est que puisque le tableau est un tableau int facultatif, les valeurs retournées devront être déballées avant de les utiliser, cependant nous utilisons la liaison optionnelle ici dans l'instruction For Case pour que la valeur soit déballée dans la variable "val ". Mais la variable "val" elle-même semble être une variable optionnelle qui signifie que la valeur doit être déballée à nouveau dans l'instruction print, mais cela donne une erreur: "ne peut pas forcer la valeur du type non optionnel 'Int'" que "val" n'est pas une variable optionnelle.Options dans l'instruction For Case

Ceci est vraiment déroutant. Quelqu'un peut-il expliquer pourquoi la variable "val" n'est pas une variable optionnelle lorsque nous utilisons "?" avec ça !!

Merci, Ujjwal

Répondre

2

val? est le "modèle en option" et un raccourci pour .some(val). Il correspond à une expression facultative si cette expression n'est pas nil, puis lie val à la valeur déballée valeur de l'expression correspondante.

De Optional Patterns:

An optional pattern matches values wrapped in a some(Wrapped) case of an Optional<Wrapped> enumeration. Optional patterns consist of an identifier pattern followed immediately by a question mark and appear in the same places as enumeration case patterns.

Par conséquent val est une Int non facultative, comme vous avez observé.

0

Lorsque vous utilisez for case, vous effectuez une itération sur une collection sous conditions. Il va seulement itérer et traiter les éléments qui correspondent au modèle. Dans le cas où vous décrivez, il est val? en d'autres termes optional.