我有一系列图片。用户可以从照片库中添加其他图像到此阵列中。因此,当他们添加时,我想检查该图像是否已经存在,如果存在,我需要跳过添加。
我在下面试过但是对图像数组不起作用
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
}
答案 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
}
}
元素的数组。