Swift拆分UIImage数组为奇偶索引数组时append返回nil问题
问题分析与解决方案
嘿,这问题很典型!你遇到的核心问题是**evenImages和oddImages没有被初始化**——它们被声明为可选数组[UIImage]?,默认值是nil,而nil是没法调用append方法的,所以不管怎么循环,这两个数组始终是nil。
修正步骤:
- 初始化数组:把可选数组改成非可选的空数组,或者在
didSet里先初始化它们; - 避免强制解包:用可选绑定处理
imageArray,防止nil时崩溃; - 清空旧数据:每次
imageArray更新时,先清空两个结果数组,避免重复添加。
修正后的完整代码:
var evenImages: [UIImage] = [] var oddImages: [UIImage] = [] var imageArray: [UIImage]? { didSet{ // 清空之前的结果,防止重复累加 evenImages.removeAll() oddImages.removeAll() // 可选绑定,安全处理imageArray的nil情况 guard let images = imageArray else { return } // 用enumerated()同时获取索引和元素,比手动计数更清晰 for (index, image) in images.enumerated() { if index % 2 == 0 { evenImages.append(image) } else { oddImages.append(image) } } print(evenImages.count) // 现在能正常输出数量了 print(oddImages.count) } }
更简洁的写法(用filter+map):
如果你喜欢函数式编程风格,还可以用enumerated()结合filter和map一行搞定,代码更简洁:
var evenImages: [UIImage] = [] var oddImages: [UIImage] = [] var imageArray: [UIImage]? { didSet{ guard let images = imageArray else { evenImages = [] oddImages = [] return } // 筛选偶数索引的元素 evenImages = images.enumerated() .filter { $0.offset % 2 == 0 } .map { $0.element } // 筛选奇数索引的元素 oddImages = images.enumerated() .filter { $0.offset % 2 != 0 } .map { $0.element } print(evenImages.count) print(oddImages.count) } }
额外提醒:
尽量避免用!强制解包,一旦imageArray是nil,你的原代码会直接崩溃。用guard let或者if let做可选绑定才是更安全的做法~
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

