You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:31:40