您可以构建一个 Singleton 类来跟踪 UIImage 和标签之间的关系。
class TaggedImages {
static let sharedInstance = TaggedImages()
private var dict = [Int:Set<UIImage>]()
private init() { }
func add(tag:Int, to image:UIImage) {
var set = dict[tag] ?? Set<UIImage>()
set.insert(image)
dict[tag] = set
}
func remove(tag:Int, to image:UIImage) {
var set = dict[tag] ?? Set<UIImage>()
set.remove(image)
dict[tag] = set
}
func images(with tag: Int) -> [UIImage] {
guard let set = dict[tag] else { return [] }
return Array(set)
}
func tags(by image: UIImage) -> [Int] {
return dict.filter { $0.1.contains(image) }.map { $0.0 }
}
}
如您所见,该类包含一个字典,其中键是Int(标签),值是UIImage(s) 的Set。
现在我们可以
- 将一组图像与给定标签相关联。
- 每个图像可以关联到可变数量的标签。
扩展 UIImage
接下来我们给UIImage添加4个方法
extension UIImage {
func add(tag:Int) {
TaggedImages.sharedInstance.add(tag, to: self)
}
func remove(tag:Int) {
TaggedImages.sharedInstance.remove(tag, to: self)
}
var tags: [Int] {
return TaggedImages.sharedInstance.tags(by: self)
}
func has(tag tag:Int) -> Bool {
return self.tags.contains(tag)
}
}
之前扩展中定义的所有方法都使用TaggedImages共享实例来:
- 保存当前图像和标签之间的关系
- 删除关系图像标签
- 检索与当前图像关联的所有标签
如何使用
let sky = UIImage()
sky.add(tag: 1)
sky.add(tag: 2)
sky.add(tag: 3)
sky.tags // [2, 3, 1]
sky.has(tag: 1) // true
sky.has(tag: 2) // true
sky.has(tag: 100) // false
sky.remove(tag:1)
sky.has(tag: 1) // false
sky.remove(tag:1)
sky.has(tag: 1) // false
sky.tags // [2,3]