如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A

Posted

技术标签:

【中文标题】如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 Alamofire (5.4.4) 发布请求?【英文标题】:How to convert Optional<Dictionary<String, Any>> to Dictionary<String, Any> to send Alamofire (5.4.4) post request with json paramters? 【发布时间】:2021-12-23 21:49:58 【问题描述】:
class func postLoginRequest(url: String, parameters: Parameters?, success: @escaping (Any) -> Void, failure: @escaping (NetworkError) -> Void) 
             
             
             if Network.isAvailable 
                 
                 let param : [String : Any] = [
                     "username" : "x",
                     "password" : "x"
                 ]
                 print (type(of: param))
                 print(param)

                 print(type(of: parameters))
                 print(parameters)
                
                 let manager = Alamofire.Session.default
                 manager.session.configuration.timeoutIntervalForRequest = Constants.NetworkError.timeOutInterval
                 manager.request(url, method: .post, parameters: param, encoding: JSONEncoding.default ).validate(statusCode: 200..<600).responseJSON  (response) -> Void in ...

我的数据输出如下所示;

Dictionary<String, Any>

["username": "x", "password": "x"]

Optional<Dictionary<String, Any>>

Optional(["username": Optional(<TextFieldEffects.HoshiTextField: 0x11c054600; baseClass = UITextField; frame = (41 10; 286 40); text = 'x'; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x2821b45d0>; layer = <CALayer: 0x282f855c0>>), "password": Optional(<TextFieldEffects.HoshiTextField: 0x11c043600; baseClass = UITextField; frame = (41 10; 286 40); text = 'x'; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x2821afe40>; layer = <CALayer: 0x282f849c0>>)])

当我使用 param 作为参数时没问题。我可以在后端(DJango)中为 jwt auth 获取用户名和密码。但是当我使用参数作为参数值时我不能。如何进行这种转换以发送 json 正文数据。

【问题讨论】:

不要发送UITextField 作为值,发送textField.text 属性!如果需要,可以打开包装。 @Larme 非常感谢。错过是我的错。 除了您的要求之外,此代码并没有按照您的想法执行。首先,不要先检查网络可用性。苹果说不要这样做,它不会像你想象的那样工作。其次,您在将配置添加到URLSession 后对URLSessionConfiguration 的修改没有影响,因此您对timeoutIntervalForRequest 的设置没有任何作用。第三,timeoutIntervalForRequestURLRequest 的超时时间不同,所以它可能不是你想要的。 @JonShier 感谢您的意见。我会注意并检查。 【参考方案1】:

您需要 safely unwrap 将任何内容从 Optional 转换为 Type

let myDict: [String : Any]? = ["john" : "Appleseed"]
// 1. Using guard statements
guard let unwraped: [String : Any] = myDict else  
    // The value is nil
    return 

// 2. Using if statements
if let unwraped: [String : Any] = myDict  
    // unwraped value

else  
    // The value is nil

// 3. Using force unwrap (be careful, this will crash your app if myDict is nil)
let unwraped = myDict!

【讨论】:

【参考方案2】:

我的错误是将 UITextField 作为值发送。我错过了。首先我解决了这个问题。之后我使用 URLEncoding.httpBody 对数据进行编码。

if Network.isAvailable 
                 
                 let manager = Alamofire.Session.default
                 manager.session.configuration.timeoutIntervalForRequest = Constants.NetworkError.timeOutInterval
                 manager.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody ).validate(statusCode: 200..<600).responseJSON  (response) -> Void in

谢谢。

【讨论】:

以上是关于如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A

如何对空的Optional执行空检查

orElseGet 在 Optional<List<Entity>> 的情况下如何工作

如何使用 std::optional<T>::emplace 的第二个重载

Maven optional 关键字透彻图解

如果嵌套的 Optional 为空,则返回另一个 Optional