Swift中向Alamofire发送请求前如何整理数组?
在Swift中使用Alamofire发送请求前整理数组
从你的代码来看,你目前是直接把原始产品数组塞进请求参数里,还错误地在响应回调里处理数组——其实我们需要在构建请求参数的阶段就完成数组的整理操作,这样发送给服务器的就是已经处理好的数组了。
下面根据常见的数组整理需求,给你具体的实现方案:
常见的数组整理场景及实现
1. 对数组进行排序
比如按产品价格降序排列,或者按产品名称升序排列:
// 假设这是你的原始产品数据(比如从购物车、数据库获取) let originalProducts: [[String: Any]] = [ ["product_name": getName, "product_price": getTotal, "product_category": getProductType], // 可以添加更多产品条目 ] // 按产品价格降序排序(注意处理类型转换,避免崩溃) let sortedProducts = originalProducts.sorted { guard let price1 = $0["product_price"] as? Double, let price2 = $1["product_price"] as? Double else { return false // 类型转换失败时保持原有顺序 } return price1 > price2 }
2. 过滤数组(移除不符合条件的元素)
比如移除价格为0的产品,或者过滤掉特定分类的产品:
// 过滤掉价格<=0的产品 let filteredProducts = originalProducts.filter { guard let price = $0["product_price"] as? Double else { return false // 不保留类型转换失败的条目 } return price > 0 }
3. 转换数组元素(修改字段内容)
比如统一产品分类为大写,或者格式化产品价格:
// 统一产品分类为大写格式 let transformedProducts = originalProducts.map { product in var mutableProduct = product // 字典是值类型,需要创建可变副本 if let category = mutableProduct["product_category"] as? String { mutableProduct["product_category"] = category.uppercased() } // 还可以添加其他字段的修改逻辑 return mutableProduct }
4. 对每个产品的键值对排序(部分API要求参数顺序)
如果服务器要求每个产品的字段按特定顺序排列(比如按键名升序),可以这样处理:
let sortedFieldProducts = originalProducts.map { product in // 先按键名排序,再重新组装成字典 return product.sorted { $0.key < $1.key } .reduce(into: [String: Any]()) { result, pair in result[pair.key] = pair.value } }
集成到你的请求代码中
不管你选择哪种整理方式,核心都是先处理好products数组,再把它放进请求参数字典里。修改后的完整代码示例(以排序为例):
// 1. 准备原始产品数据 let originalProducts: [[String: Any]] = [ ["product_name": getName, "product_price": getTotal, "product_category": getProductType], // 其他产品... ] // 2. 整理数组:按价格降序排序 let sortedProducts = originalProducts.sorted { guard let price1 = $0["product_price"] as? Double, let price2 = $1["product_price"] as? Double else { return false } return price1 > price2 } // 3. 构建请求参数 let request = NSMutableDictionary() request.setDictionary([ "merchant_reference": getRandomMerchant, "merchant_identifier": "e54638eb", "access_code": "hRRVGXrIpHSYoH19Ebwt", "signature": base64Str, "service_command": "OTP_GENERATE", "language": "en", "payment_option": "VALU", "phone_number": "01008606003", "merchant_order_id": getRandomMerchant, "amount": getTotal, "currency": "EGP", "products": sortedProducts // 这里使用整理后的数组 ]) // 4. 发送Alamofire请求 Alamofire.request(URLAPi.URL_Payment_Api, method: .post, parameters: (request as! Parameters), encoding: JSONEncoding.default).responseJSON { (response) in debugPrint(response) if response.result.isSuccess { let jsonpayfortrequest = JSON(response.result.value!) let passobjectforrootclasspayfort = OTPGenrateModel(fromJson: jsonpayfortrequest) print(passobjectforrootclasspayfort.transaction_id!) SVProgressHUD.dismiss() } else { print("error connection") SVProgressHUD.dismiss() } }
小提醒:你原来代码里在响应回调中对jsonpayfortrequest做的排序操作,是处理服务器返回的数据,和请求前的数组整理没有关系,注意区分这两个阶段哦~
内容的提问来源于stack exchange,提问作者user12095151
相关产品推荐
相关产品推荐

