Ios Swift:删除图像数组中的重复项

时间:2017-01-02 19:44:18

标签: ios arrays swift uiimage duplicates

我有一系列图片。用户可以从照片库中添加其他图像到此阵列中。因此,当他们添加时,我想检查该图像是否已经存在,如果存在,我需要跳过添加。

我在下面试过但是对图像数组不起作用

extension Array where Element : Equatable
{
    mutating func GetDifAryFnc()
    {
        var DifAryVar:[Element] = []
        for IdxVal in self
        {
            if !DifAryVar.contains( IdxVal )
            {
                DifAryVar.append( IdxVal )
            }
        }
        self = DifAryVar
    }
}

并尝试了这个

class func GetDifImjAryFnc(ImjAryPsgVar: [UIImage]) -> [UIImage]
{
    var DifAryVar = [UIImage]()
    for IdxVal in ImjAryPsgVar
    {
        if !DifAryVar.contains( IdxVal )
        {
            DifAryVar.append( IdxVal )
        }
    }

    return DifAryVar
}

2 个答案:

答案 0 :(得分:0)

你是什么意思"图像已经存在?"这些图像是从磁盘加载的吗?" as-is"?如果使用Array contains方法,则图像必须逐字节相同才能匹配。如果即使1个像素不同,或者如果它们在不同时间进行JPEG压缩,它们也可能不匹配。

Array contains方法依赖于符合equatable协议的对象,我相信它会检查图像数据上的byte-wize哈希值。)

编辑:

实际上,Apple的这篇文章暗示UIImage对象的等同比较可能无法正常工作:

https://developer.apple.com/reference/uikit/uiimage(请参阅标题为&#34的部分;比较图像")

答案 1 :(得分:0)

假设 你的衡量标准是Apple公司UIImage符合Equatable协议的实现所提供的,那么为什么不使用{{1}而不是Set

Array

如果您的平等度量不同比Apple的实现(我们可以假设它基于比较图像数据*),那么您将必须指定它。

* Apple的let image1 = UIImage(imageLiteralResourceName: "stack_view") let image2 = UIImage(imageLiteralResourceName: "stack_view") let image3 = UIImage(imageLiteralResourceName: "stack_view2") if image1.isEqual(image2) { print("We are the same!") // Prints We are the same! } else { print("We are different!") } var images = Set<UIImage>() images.insert(image1) images.insert(image2) // No effect since the same image is already in the set images.insert(image3) images.count // The count is 2 (not 3) 文档显示了使用UIImage方法而不是UIImage运算符比较isEqual(_:)实例的正确方法。

修改

如果必须使用数组,则可以创建如下的扩展名:

==

这将返回一个包含唯一extension Array where Element: UIImage { func unique() -> [UIImage] { var unique = [UIImage]() for image in self { if !unique.contains(image) { unique.append(image) } } return unique } } 元素的数组。