Ios Swift:删除图像数组中的重复项
Posted
技术标签:
【中文标题】Ios Swift:删除图像数组中的重复项【英文标题】:Ios Swift : Remove duplicates in an array of images 【发布时间】:2017-01-02 19:44:17 【问题描述】:我有一组图像。用户可以从照片库中将其他图像添加到该数组中。因此,当他们添加时,我想检查该图像是否已经存在,如果存在,我需要跳过添加。
我在下面尝试但不适用于图像数组
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
【问题讨论】:
Swift 中的方法和变量名应该使用小写。 如何确定两个图像相等?它们来自同一个文件吗?它们有相同的像素吗? 删除重复项确实很常见。你先搜索了吗?
换行,大写驼峰式,无需将 Index
缩写为 Idx
(保存了 2 个字符?)。 C# 程序员,很容易被发现。
【参考方案1】:
“图像已经存在”是什么意思?这些图像是“按原样”从磁盘加载的吗?如果您使用 Array contains
方法,则图像必须逐字节相同才能匹配。如果即使有 1 个像素不同,或者它们在不同时间被 JPEG 压缩,它们也可能不匹配。
(Array
contains
方法依赖于符合equatable
协议的对象,我相信它会检查图像数据上的字节大小散列。)
编辑:
实际上,Apple 的这篇文章暗示 UIImage 对象的等价比较可能无法正常工作:
https://developer.apple.com/reference/uikit/uiimage(参见标题为“比较图像”的部分)
【讨论】:
【参考方案2】:假设你的平等衡量标准是Apple 实现UIImage
符合Equatable
协议所提供的,那么为什么不使用Set
而不是Array
?
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)
如果您的平等衡量标准与 Apple 的实现方式不同(我们可以假设它是基于比较图像数据*),那么您必须指定这一点。
*Apple 的UIImage
文档显示了使用isEqual(_:)
方法而不是==
运算符比较UIImage
实例的正确方法。
编辑:
如果你必须使用数组,那么你可以像这样创建一个扩展:
extension Array where Element: UIImage
func unique() -> [UIImage]
var unique = [UIImage]()
for image in self
if !unique.contains(image)
unique.append(image)
return unique
这将返回一个包含唯一 UIImage
元素的数组。
【讨论】:
您对 UIImage 的 equatable 协议实现在内部使用什么有什么看法?如果它使用 isEqual 那么 contains: 函数应该可以正常工作。 @DuncanC 我认为Equatable
协议的实现与isEqual(_:)
在幕后是一样的。我同意contains(_:)
应该基于这种想法正常工作。因此,编写一个使用contains(_:)
检查数组是否已经包含UIImage
的方法应该是可行的。以上是关于Ios Swift:删除图像数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章
如何使用背景图像删除 > iOS 10 和 Swift 4 中的 Tab Bar 顶部边框(阴影)?