为Alamofire POST请求创建主体Swift 4

时间:2018-10-12 13:01:19

标签: arrays swift dictionary post alamofire

在使用Alamofire发送POST请求时,我需要有关创建自定义主体的帮助。

我要发送给API产品。有两种类型的产品。第一种类型仅具有数量,第二种类型具有数量(size_id)和与每个size_id相匹配的数量。

最终身体应如下所示:

"factory_id": "1"

"order_products[0][product_id]": "1"
"order_products[0][size_id]": "2"
"order_products[0][quantity]": "10"

"order_products[1][product_id]": "1"
"order_products[1][size_id]": "3"
"order_products[1][quantity]": "10"

"order_products[1][product_id]": "2"
"order_products[1][size_id]": "2"
"order_products[1][quantity]": "10"

"order_products[2][product_id]": "3"
"order_products[2][quantity]": "10"

这是我到目前为止所取得的成就:

var createOrderBody = [String: Any]()
let productIds = ["1", "2", "3"]
var body = [String: Any]()
var quantity = ["1" : "10", "2": "10"]
var noIdQuantity = ["10"]
var finalBody = [String: Any]()

func formBody(products: String, factoryId: String, productId: String, size_id: String, quantity: String) -> [String: Any] {

    createOrderBody["factory_id"] = factoryId
    createOrderBody["order_products[\(products)][product_id]"] = productId
    createOrderBody["order_products[\(products)][size_id]"] = size_id
    createOrderBody["order_products[\(products)][quantity]"] = quantity

    return createOrderBody
}

for (index, value) in productIds.enumerated() {

    for (id, size) in quantity {
        print(id)
        print(size)
        body = formBody(products: String(index), factoryId: "1", productId: String(value), size_id: id, quantity: size)
        print("Body quantity - ", body)
    }
}

我得到的结果是:

"factory_id": "1",

"order_products[0][product_id]": "1"
"order_products[0][size_id]": "2", 
"order_products[0][quantity]": "10",

"order_products[1][product_id]": "2",
"order_products[1][size_id]": "2",  
"order_products[1][quantity]": "10",

"order_products[2][product_id]": "3",
"order_products[2][size_id]": "2", 
"order_products[2][quantity]": "10", 

如您所见,我几乎达到了预期的结果,但是问题在于它仅添加了quantity字典的最后一个元素,而忽略了其他值。另外,我不知道如何为没有size_id

的产品增加数量

此外,我知道将for in循环放在其他for in循环中不是一个好习惯,但是我是开发新手,这是我想到的最好的主意。

在此问题上的任何帮助将不胜感激,因为我现在已经与之抗争了近一个星期。

非常感谢,周末愉快!

1 个答案:

答案 0 :(得分:0)

在Internet上进行搜索和搜索之后,以下是我们在此遇到的问题的解决方案。作为参考,请在此处原始帖子-Original Post

假设每种产品必须拥有自己的数量:

我们可以这样定义一个结构:

multiprocessing.Process()

使用上述结构,我们只需要一个输入变量和一个输出变量:

struct Product {  
    let id: String  
    let quantities: [(sizeId: String, quantity: Int)]?  
    let noIdQuantity: Int?  

    init(id: String, quantities: [(sizeId: String, quantity: Int)]) {  
        self.id = id  
        self.quantities = quantities  
        self.noIdQuantity = nil  
    }  

    init(id: String, quantity: Int) {  
        self.id = id  
        self.quantities = nil  
        self.noIdQuantity = quantity  
    }  
} 

要将单个产品输入词典:

// Define input `product with id` as an Array of `Product`  
let products = [  
    Product(id: "1", quantities: [("1", 10), ("2", 10)]),  
    Product(id: "2", quantities: [("1", 10), ("2", 10)]),  
    Product(id: "3", quantities: [("1", 15), ("2", 20)]),  
    Product(id: "4", quantity: 10),  
]  
// Output dictionary  
var body = [String: Any]()  

并按如下所示使用它们:

extension Product {  
    func formBody(_ index: inout Int, into body: inout [String: Any]) {  
        if let quantities = self.quantities {  
            for (sizeId, quantity) in quantities {  
                body["order_products[\(index)][product_id]"] = self.id  
                body["order_products[\(index)][size_id]"] = sizeId  
                body["order_products[\(index)][quantity]"] = quantity  
                index += 1  
            }  
        }  
        if let quantity = self.noIdQuantity {  
            body["order_products[\(index)][product_id]"] = self.id  
            body["order_products[\(index)][quantity]"] = quantity  
            index += 1  
        }  
    }  
}  

因此,最终结果将是:

var index = 0  
body["factory_id"] = "1"  
for product in products {  
    product.formBody(&index, into: &body)  
}  
print("Body quantity - ", body)  
body.sorted {$0.key < $1.key}.forEach{print("\($0.key)=\($0.value)")} //For showing readable result, not for Alammofire body  

希望这对结构相同或相似的人有所帮助。