Когда я использую UserDefaults.standard.object в Alamofire, отображается ошибка «Дополнительный аргумент при вызове»

#ios #swift #xcode #alamofire

#iOS #swift #xcode #alamofire

Вопрос:

Когда я использую функцию Alamofire с некоторыми CoreData, подобными UserDefaulfts.standard.object тогда xcode выдает ошибку Extra Argument in call я перепробовал приблизительно все ответы из Stackoverflow, подобные HTTPMethod и .JSONEncoding , но ничего не происходит

 func Sync(){

    let url = "http://abcd.com/reportlist"
    let parameters = ["sort_by":"month_year",
                      "start":"1",
                      "end":"10"]


    let key2 = UserDefaults.standard.object(forKey: "accessToken") 

    let headers = [
        "Authorization": key2,
        "Content-Type": "application/x-www-form-urlencoded"]


    Alamofire.request(url, method: .post, parameters: parameters, headers: headers).responseJSON { response in
        if response.result.isSuccess
        {

            var dictVal = response.result.value
            let data1 = response.data
            .................
  

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

1. Привет. Вы не могли бы выбрать ответ, который показался вам полезным?

Ответ №1:

Удерживайте клавишу option и нажмите object(forKey function, чтобы прочитать подсказку к документации. Вы увидите, что возвращаемый тип этой функции необязателен, поскольку ничто не может быть сохранено под ключом, который вы передаете, верно? Таким образом, ваша key2 константа также имеет необязательный тип.

Затем, когда вы используете его в словаре, headers само становится типом "String: Optional(String)" , поскольку одно из значений является необязательным (key2).

Alamofire ожидает, что в [String: String] параметре будет указан тип headers словаря, и, поскольку тип вашего headers dict не совпадает, он генерирует эту ошибку — extra argument . Нравится I don't know why you pass it to me I do not expect anything of type like that

Вот и все

Таким образом, вы либо используете string(forKey метод, который вернет пустую строку в случае, если под переданным ключом ничего не сохранено, либо предоставляете значение по умолчанию, подобное этому

let key2 = (UserDefaults.standard.object(forKey: "accessToken") as? String) ?? "defaultAccessTokenOrNothing" которая дает тот же результат, что и первое предложение

Ответ №2:

используемый здесь ключ имеет строковый тип, и при передаче заголовка вы не указали тип переменной в заголовке

прежде чем я использовал это

let key2:String = UserDefaults.standard.object(forKey: "accessToken") as! String

xcode снова рад кодировать…

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

1. если вы используете as! String , то приложение завершит работу, когда «accessToken» не существует. Вы можете использовать: as? String ?? "" (значение по умолчанию) или guard... или if let... или что угодно по вашему желанию. Используйте только ! когда вы уверены, что значение не равно нулю.

2. Вы знаете, что есть даже string(forKey ? Однако он также возвращает необязательное значение.