let images = imageNames.compactMap { UIImage(named: $0) }

16 阅读1分钟
func setImageNames(_ imageNames: [String]) {
        let images = imageNames.compactMap { UIImage(named: $0) }
        setImages(images)
    }

方法来处理图片名称数组,让我详细解释一下:# 这段代码使用了 Swift 中的 compactMap 方法来处理图片名称数组,让我详细解释一下:

代码功能

let images = imageNames.compactMap { UIImage(named: $0) }

这行代码的作用是将字符串数组 imageNames 转换为 UIImage 对象数组。

compactMap 的作用

compactMap 有两个主要功能:

  1. 转换(Map):对数组中的每个元素执行转换操作
  2. 过滤(Compact):自动过滤掉转换结果为 nil 的元素

具体执行过程

假设有:

let imageNames = ["photo1", "photo2", "invalid_image", "photo3"]

执行流程:

  1. 遍历 imageNames 中的每个元素
  2. 对每个图片名称调用 UIImage(named: $0)
  3. 如果图片存在,返回对应的 UIImage 对象
  4. 如果图片不存在(返回 nil),自动过滤掉该元素
  5. 最终返回一个只包含有效图片的 [UIImage] 数组

与普通 map 的区别

// 使用 map - 可能包含 nil 值
let imagesWithNil = imageNames.map { UIImage(named: $0) }
// 结果类型: [UIImage?]

// 使用 compactMap - 自动过滤 nil
let imagesWithoutNil = imageNames.compactMap { UIImage(named: $0) }
// 结果类型: [UIImage]

实际效果

如果资源中存在 "photo1" 和 "photo3" 但不存在 "invalid_image":

  • 输入:["photo1", "photo2", "invalid_image", "photo3"]
  • 输出:[UIImage(photo1), UIImage(photo3)]

这样确保了 setImages(images) 方法接收到的都是有效的图片对象,避免了因图片不存在导致的异常。