web-dev-qa-db-fra.com

Type d'expression ambigu sans contexte supplémentaire Swift

Je reçois un ' Le type d'expression est ambigu sans plus de contexte ' sur cette partie de code d'un projet que j'essaie de mettre à niveau vers la dernière version de Swift. Je n'arrive pas à comprendre. J'ai essayé différentes choses mais je ne peux pas le faire fonctionner.

Le problème est sur la syntaxe de cette ligne 

let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }

Code complet:

extension TutorialCreationRequest: WebserviceParametrable {
    func toParameters() -> [String: AnyObject] {
        let imageParameters = images.map { ["url": $0] }
        let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }
        return [
            "title": title,
            "is_draft": isDraft,
            "difficulty": difficulty,
            "duration": duration,
            "cost": cost,
            "user_id": userId,
            "description": description,
            "to_sell": toSell,
            "images": [imageParameters, imageToDeleteParameters].flatMap { $0 }
        ]
    }
}
16
Florian VIDAL

Le compilateur ne peut pas déterminer le type de dictionnaire, car il n'est pas homogène. Vous avez des valeurs de différents types. La seule façon de contourner cela est d’en faire un [String: Any], ce qui rendra tout maladroit comme si de rien.

return [
    "title": title,
    "is_draft": isDraft,
    "difficulty": difficulty,
    "duration": duration,
    "cost": cost,
    "user_id": userId,
    "description": description,
    "to_sell": toSell,
    "images": [imageParameters, imageToDeleteParameters].flatMap { $0 }
] as [String: Any]

C'est un travail pour un struct. Cela simplifiera grandement l'utilisation de cette structure de données.

10
Alexander

Cela se produit lorsque vous avez une fonction avec des noms d'argument incorrects.

Exemple:

functionWithArguments(argumentNameWrong: , argumentName2: )

et vous avez déclaré votre fonction comme:

functionWithArguments(argumentName1: , argumentName2: ){}

Cela se produit généralement lorsque vous avez changé le nom d'une variable. Assurez-vous de refactoriser lorsque vous faites cela.

7
Daniel Bastidas

Pas une réponse à cette question, mais comme je suis venu ici à la recherche de l’erreur, d’autres pourraient trouver cela aussi utile:

Pour moi, j'ai eu cette erreur Swift lorsque j'ai essayé d'utiliser la boucle for (index, object) sur un tableau sans ajouter la partie .enumerated() ...

4
TheEye

Déclarer explicitement les entrées pour cette fonction de mappage devrait faire l'affaire:

let imageToDeleteParameters  = imagesToDelete.map {
    (whatever : WhateverClass) -> Dictionary<String, Any> in
    ["id": whatever.id, "url": whatever.url.absoluteString, "_destroy": true]
}

Substituez la classe réelle "$ 0" à "WhateverClass" dans cet extrait de code et cela devrait fonctionner. 

1
Jeremy Gurr

J'ai eu cette erreur quand je mets un espace avant une virgule dans les paramètres lors de l'appel d'une fonction.

par exemple, j'ai utilisé:

myfunction(parameter1: parameter1 , parameter2: parameter2)

Considérant que cela aurait dû être:

myfunction(parameter1: parameter1, parameter2: parameter2)

La suppression de l'espace a éliminé le message d'erreur

0
narco