将谓词应用于数组中的元素

Applying predicate to an element in array

我收到邮递员的以下回复...

"product_images": [
                {
                    "id": "973",
                    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_1_image",
                    "is_default": "0"
                },
                {
                    "id": "988",
                    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_10_image",
                    "is_default": "0"
                },
                {
                    "id": "989",
                    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_11_image_1507874590",
                    "is_default": "1"
                }
            ]

现在我想应用一个谓词并仅将 is_default 值为 1 的图像添加到我的数组中。因此在这种情况下,只会添加最后一张图像。那么我怎样才能做到这一点......?希望有人能帮忙...

截至目前,所有图像都已添加到数组中,我正在这样做...

var productImages :[ProductImage] = []
        if let images = anItem["product_images"] as? [[String:String]]
        {
          for image in images {
            guard let imageId = image["id"],
                  let url1 = image["image"],
                  let isDefaultValue = image["is_default"] else {continue}
                  print(imageId)
                 let productImage = ProductImage(id: imageId, url: URL(string: url1)!, isDefault: (Int(isDefaultValue) ?? 0) != 0)                        
                productImages.append(productImage)
            }}

        let theProduct = Product(name: name, id: id, theRate: rate, quantity: qty, sku: skuCode, prdCateg: prodCat, prodDescr: description, images: productImages, mrp: mrp)

        self.productData1.append(theProduct)

解决方案 1

一行代码即可实现

在swift 3中可以使用filter代替predicate

let productsWithDefaultImage = productImages.filter{[=11=].isDefault == 1}

解决方案 2

按照 Ahmed 的建议,只需复制并粘贴即可

  var productImages :[ProductImage] = []
    if let images = anItem["product_images"] as? [[String:String]]
    {
      for image in images {
        guard let imageId = image["id"],
              let url1 = image["image"],
              let isDefaultValue = image["is_default"],
              isDefaultValue == "1" else {continue}
              print(imageId)
             let productImage = ProductImage(id: imageId, url: URL(string: url1)!, isDefault: (Int(isDefaultValue) ?? 0) != 0)                        
            productImages.append(productImage)
        }}

    let theProduct = Product(name: name, id: id, theRate: rate, quantity: qty, sku: skuCode, prdCateg: prodCat, prodDescr: description, images: productImages, mrp: mrp)

    self.productData1.append(theProduct)

您可以在附加到 productImages 数组之前简单地 productImage.isDefault 值:

if let images = anItem["product_images"] as? [[String:String]]
{
    for image in images {
        guard let imageId = image["id"],
              let url1 = image["image"],
              let isDefaultValue = image["is_default"] else {continue}

        print(imageId)

        let productImage = ProductImage(id: imageId, url: URL(string: url1)!, isDefault: (Int(isDefaultValue) ?? 0) != 0)

        // just add a simple check here:
        if productImage.isDefault == 1 {
            productImages.append(productImage)
        }
    }
}

这是一个工作 playground,展示了您可以做什么

import UIKit
import PlaygroundSupport


let productImages: [[String:String]] = [
    [
    "id": "973",
    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_1_image",
    "is_default": "0"
    ],
    [
    "id": "988",
    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_10_image",
    "is_default": "0"
    ],
    [
    "id": "989",
    "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_11_image_1507874590",
    "is_default": "1"
    ]
]

let productsWithDefaultImage = productImages.filter {

    if let is_default: String = [=10=]["is_default"] {
        if is_default == "1" {
            return true
        }
    }

    return false

}

假设总是只有一个 default图像使用first函数

var productImages = [ProductImage]()
if let images = anItem["product_images"] as? [[String:String]]
{
     if let defaultImage = images.first(where: {[=10=]["is_default"] == "1"}) {
        let productImage = ProductImage(id: defaultImage["id"]!, 
                                       url: URL(string: defaultImage["image"]!)!, 
                                 isDefault: true)                        
        productImages.append(productImage)
     }
...

编辑

这是要在 Playground 中测试的单机版本

struct ProductImage {
    let id : String
    let url : URL
    let isDefault : Bool
}

let images = [
    ["id": "973", "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_1_image", "is_default": "0"],
    ["id": "988", "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_10_image", "is_default": "0"],
    ["id": "989", "image": "http://sellerapp.binaryicdirect.com/public/uploads/products/263_22_11_image_1507874590", "is_default": "1"]
]

var productImages = [ProductImage]()
if let defaultImage = images.first(where: {[=11=]["is_default"] == "1"}) {
    let productImage = ProductImage(id: defaultImage["id"]!,
                                    url: URL(string: defaultImage["image"]!)!,
                                    isDefault: true)
    productImages.append(productImage)
}
print(productImages)