2016-11-30 2 views
4

Я получаю 'Тип выражения неоднозначен без контекста' в этой части кода из проекта. Я пытаюсь обновить до последней версии 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 } 
     ] 
    } 
} 

ответ

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] 

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

+1

Я думаю, вы имеете в виду * «У вас есть ** значения ** разных типов» * – rmaddy

+0

@rmaddy Да, исправлено – Alexander

1

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

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

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