【问题标题】:How to convert Any hashable data to send as parameters for making an API call using Alamofire?如何将任何可散列数据转换为使用 Alamofire 进行 API 调用的参数发送?
【发布时间】:2024-01-13 23:17:01
【问题描述】:

我有一个函数,当用户在应用程序内单击登录时调用该函数。我以 Anyhashable 格式获取用户输入的密码和用户名。在将 userDataContent 作为参数传递的地方进行 Alamofire 调用。 我的登录功能,

    func loginWithUserData(userData: Dictionary<String, Any> 
          ,completion: @escaping (_ success:DataResponse<Any>)->Void) {
           print("userDataContent in loginWithUsertDataCall: ", userData) 
NetworkManager.sharedNetworkManager.performNetworkOperation(url: myEndpoint().userSession(), httpmethod: .post, parameters: userData) { response in
        completion(response)
    }
}

我将以下内容作为我的用户数据(其中包含用户名和密码),

    userDataContent in loginWithUsertDataCall:  
    ["user": 
        [AnyHashable("password"): <TextFieldValidator: 0x7fa94e89aa00; 
            baseClass = UITextField; 
            frame = (0 0; 155.333 23.3333);
            text = '**MYPASSWORD123**'; 
            opaque = NO;
            autoresize = RM+BM; 
            gestureRecognizers = <NSArray: 0x604000a468a0>; 
            layer = <CALayer: 0x604000833be0>>, 
        AnyHashable("email"): <TextFieldValidator: 0x7fa94e90be00; 
            baseClass = UITextField; 
            frame = (0 0; 263.667 23.3333); 
            text = '**myloginEmail@test.com'**; 
            opaque = NO; 
            autoresize = RM+BM; 
            gestureRecognizers = <NSArray: 0x604000a547f0>; 
            layer = <CALayer: 0x604000638840>>
        ]
    ]

我的问题是,应该如何修改 Anyhashable,以便我可以在我正在进行的 Alamofire 网络调用中将用户名和密码作为参数发送。欢迎任何指导。

【问题讨论】:

  • 为什么要发送TextFieldValidator,它似乎是UITextField 的子类?你为什么不直接发送它的text 属性?应该是 ["user:["password":(textField1.text), "email":(textField2.text)]] 其中textField1 & textField2 对应正确的TextFieldValidator
  • @SeaWarrior404 检查答案希望这对你有用

标签: ios swift alamofire


【解决方案1】:

我了解到您有一个名为 TextFieldValidatorUITextField 子类。

你这样做:

let userData = ["user": ["password": myTextFieldValidatorForPassword,
                         "email": myTextFieldValidatorForEmail]]

你应该这样做:

let userData = ["user": ["password": myTextFieldValidatorForPassword.text,
                         "email": myTextFieldValidatorForEmail.text]]

因为您对这些文本字段的 text 值感兴趣,而不是对 UI 对象感兴趣。您可以使用任何 UI 对象,您的 API 并不关心这些,它关心的是 String 值。

【讨论】:

    【解决方案2】:

    创建一个参数字符串并转换如下

         let ParameterString = "{\"auth\":{\"email\":\"\(ws_email)\",\"password\":\"\(ws_password)\"},\"emailId\":\"\(EmailId)\"}"
    
        let parameters = self.convertToDictionary(text: ParameterString)
        static func convertToDictionary(text: String) -> [String: Any]? {
    
            if let data = text.data(using: .utf8) {
                do {
                    return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                } catch {
                    print(error.localizedDescription)
                }
            }
            return nil
        }
    

    【讨论】:

    • 为什么要使用字符串?为什么不直接创建字典?