Тип выражения неоднозначен без дополнительного контекста Swift

Я получаю " Тип выражения неоднозначен без контекста" в этой части кода из проекта, который я пытаюсь обновить до последней версии Swift. Кажется, я не понимаю. Я пробовал разные вещи, но не могу заставить его работать.

Проблема заключается в синтаксисе этой строки

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

Полный код:

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 }
        ]
    }
}

Ответ 1

Не ответ на этот вопрос, но, поскольку я пришел сюда в поисках ошибки, другие могут счесть это также полезным:

Для меня я получил эту ошибку Swift, когда пытался использовать цикл for (index, object) для массива без добавления части .enumerated()...

Ответ 2

Компилятор не может понять, какой тип словаря, потому что он не является однородным. У вас есть значения разных типов. Единственный способ обойти это - сделать его [String: Any], который сделает все неуклюжим, как и весь ад.

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]

Это задание для структуры. Это значительно упростит работу с этой структурой данных.

Ответ 3

Это происходит, когда у вас есть функция с неправильными именами аргументов.

Пример:

functionWithArguments(argumentNameWrong: , argumentName2: )

и вы объявили свою функцию как:

functionWithArguments(argumentName1: , argumentName2: ){}

Обычно это происходит, когда вы меняете имя переменной. Убедитесь, что вы рефакторинг, когда вы делаете это.

Ответ 4

Явное объявление входных данных для этой функции отображения должно выполнить трюк:

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

Подставьте реальный класс "$ 0" для "WhateverClass" в этом фрагменте кода, и он должен работать.

Ответ 5

Я получил эту ошибку, когда ставил пробел перед запятой в параметрах при вызове функции.

Например, я использовал:

myfunction(parameter1: parameter1 , parameter2: parameter2)

Принимая во внимание, что это должно было быть:

myfunction(parameter1: parameter1, parameter2: parameter2)

Удаление пробела избавило от сообщения об ошибке

Ответ 6

У меня было это сообщение, когда тип параметра функции не подходил. В моем случае это была строка вместо URL.