Swift中可选UIImage数组追加元素后仍为nil的原因
问题原因解析
这是个非常典型的可选类型使用误区,我来帮你理清楚背后的逻辑:
首先,你声明的全局变量 var images: [UIImage]? 是一个可选数组,在没有手动初始化的情况下,它的默认值是 nil——注意,这和空数组 [] 是完全不同的状态:nil 表示这个变量根本没有指向任何数组实例,而空数组是已经存在的、只是元素为空的数组对象。
接下来看你 process 函数里的这段代码:
images.forEach { self.images?.append($0) }
这里用到了可选链调用(就是那个问号 ?),Swift 里可选链的规则是:如果问号前面的可选值是 nil,那么整个调用会被「短路」,也就是后面的 append($0) 完全不会执行。因为你的 self.images 一开始是 nil,所以循环里的每一次 append 都没有实际运行,self.images 自然还是保持 nil 状态,打印结果也就显示为 true 了。
而当你改成直接赋值:
self.images = images
这时候你是把参数里的非可选数组实例直接赋值给了 self.images,相当于给这个可选变量「创建并绑定了一个数组实例」,它自然就不再是 nil 了。
补充:如果想保留 append 的方式,怎么修改?
如果你希望通过追加元素的方式填充全局数组,可以先确保 self.images 有一个数组实例:
- 初始化时给默认空数组:
var images: [UIImage]? = []
这样一开始就不是 nil,append 可以正常执行。
- 追加前先判断初始化:
func process(_ images: [UIImage]) { // 如果当前是 nil,先创建空数组 if self.images == nil { self.images = [] } images.forEach { self.images?.append($0) } print("images nil?:", self.images == nil) }
- 用空合运算符简化:
func process(_ images: [UIImage]) { // 把现有数组(空数组如果是nil)和新数组合并 self.images = (self.images ?? []) + images print("images nil?:", self.images == nil) }
内容的提问来源于stack exchange,提问作者Ivan Cantarino
相关产品推荐
相关产品推荐

