Многопараметрический словарь (список коллекций) Например: [[Строка: любая]] для параметров Alamofire

#ios #swift #dictionary #alamofire #swift5

#iOS #swift #словарь #alamofire #swift5

Вопрос:

Привет, я пытаюсь передать в alamofire параметры, называемые «Dict», которые находятся в словаре…словарь может содержать 3 или X элементов. Я пытаюсь использовать для цикла словарь ad для другого набора элементов, but…it отображается только последний…кажется, это переопределяет предыдущий. Я перепробовал все, что знаю…Даже попробуйте использовать SwiftyJSON framework …. но alamofire принимает только чистый тип словаря.

     var Dict = [[String: Any]]()
    
    Dict.removeAll()
    
    for (index, value) in _SurveySubmitModel.enumerated() {
        print("Item (index   1): (value)")
        
        let parameters: [String: Any] = [
            "ID": value.ID,
            "SurveyID": value.SurveyID,
            "QuestionID": value.QuestionID,
            "FilledBy": value.FilledBy,
            "Response": value.Response
        ]
        
        Dict.append(parameters)
        
    }
    
    print("Dict = (Dict)")
  

ну, мне нужно что-то вроде этого

  [{
  "ID": 0,
  "SurveyID": 25,
  "QuestionID": 28,
  "FilledBy": 7335,
  "Response": "1In the two weeks before you felt sick, did you:"
 },
 {
  "ID": 0,
  "SurveyID": 25,
  "QuestionID": 28,
  "FilledBy": 7335,
  "Response": "1In the two weeks before you felt sick, did you:"
 }
 ]
  

Комментарии:

1. Какой тип данных _SurveySubmitModel?

2. Привет @Prakash спасибо за ваш ответ, я использую эту модель, например: struct SurveySubmitModel: Codable { var ID = Int() var SurveyID = Int() var QuestionID = Int() var FilledBy = Int() var Response = String() }

3. тогда один элемент будет в _SurveySubmitModel? Это не массив или коллекция. Вместо этого вы можете использовать var surveryList = [SurveySubmitModel] и сохранить в нем все ваши данные.

4. да, я использую то же самое, что вы отправили: var _SurveySubmitModel = [SurveySubmitModel]() и добавляю такие данные, как: _SurveySubmitModel.append(SurveySubmitModel (ID: 0, SurveyID: 25, QuestionID: 28, FilledBy: 7335, Ответ: «1 За две недели до того, как вы почувствовали себя плохо, вы:» )) но Аламофайр это не поддержал. я думаю, что я пропустил какой-то шаг, можете ли вы сказать мне, поняли ли вы мою точку зрения?

5. Можете ли вы поделиться кодом, который собирает все данные в вашей коллекции? Чтобы я мог помочь

Ответ №1:

Попробуйте приведенный ниже код, который я изменил [String: Any] на NSDictionary . Также изменен for цикл.

 var _SurveySubmitModel = [SurveySubmitModel]()

_SurveySubmitModel.append(SurveySubmitModel(ID: 0, SurveyID: 25, QuestionID: 28, FilledBy: 7335, Response: "1In the two weeks before you felt sick, did you:"))
_SurveySubmitModel.append(SurveySubmitModel(ID: 0, SurveyID: 25, QuestionID: 28, FilledBy: 7335, Response: "1In the two weeks before you felt sick, did you:"))
        
for survey in _SurveySubmitModel {
    
    let parameters: NSDictionary = [
        "ID": survey.ID,
        "SurveyID": survey.SurveyID,
        "QuestionID": survey.QuestionID,
        "FilledBy": survey.FilledBy,
        "Response": survey.Response
    ]
    
    Dict.append(parameters)
    
}
print("Dict == ", Dict)

  

Вывод

 Dict ==  [{
    FilledBy = 7335;
    ID = 0;
    QuestionID = 28;
    Response = "1In the two weeks before you felt sick, did you:";
    SurveyID = 25;
}, {
    FilledBy = 7335;
    ID = 0;
    QuestionID = 28;
    Response = "1In the two weeks before you felt sick, did you:";
    SurveyID = 25;
}]

  

Попробуйте следующую функцию для вызова веб-службы

 func postValues(requestParams: [[String: AnyObject]], urlString: String) {

    let url = URL(string: urlString)
    var request = URLRequest(url: url!)
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    request.httpBody = try! JSONSerialization.data(withJSONObject: requestParams, options: [])

    AF.request(request).responseJSON { (response) in
        switch response.result {
        case .success:
          //  print(response.result.value)
            break
        case .failure:
            print(response.error)
            break
        }
    }
}
  

Комментарии:

1. Привет @Prakash, это решение работает, но мой вопрос в том, как я могу передать окончательный Dict в Alamofire в качестве параметра? поскольку Alamofire принимает только [String: Any], а не [[String: Any]], вот мой код, где я могу указать «Dict» ClientApi.objGlobalMethod. ServiceMethod(url: surveySubmitApi(sitename: SiteID), метод: «POST», параметры: Dict ) { (ответ) в печати («ответ = (response)»)

2. Если это метод POST, параметры должны отображаться в теле, поэтому просто выполните синтаксический анализ JSON (если это JSON) с помощью JSONSerilzaition и поместите его самостоятельно. Найдите все «Alamofire Array Parameter», вы увидите ответы.

3. Спасибо за ваше время @Prakash, теперь это работает, вы спасаете мой день.