为何会出现双重可选类型(Data??)的诡异编译错误?
双重可选类型错误的原因解析
你遇到的这个错误不是编译器Bug,而是Swift可选类型嵌套的特性导致的,具体拆解如下:
核心类型推导逻辑
- 你定义的
completionHandler要求返回类型为Data?(单层可选) - 闭包中返回的
datas.first,其中datas的类型是[Data?](元素为单层可选的数组)
在Swift中,数组的first方法本身会返回一个可选值:数组为空时返回nil,有元素时返回第一个元素。而你的数组元素本身就是Data?(可选类型),所以datas.first的实际类型是Optional<Data?>,也就是Data??——这是两层可选的嵌套:
- 外层可选:对应
first方法的特性,标识数组是否存在元素 - 内层可选:对应数组元素的类型,标识单个元素是否为
nil
因为completionHandler要求返回单层可选Data?,直接返回双重可选的datas.first就会触发类型不匹配的报错。
可复现代码
import Foundation public class testClass { var id: Int64? init(id: Int64?, completionHandler: (([Data?], Bool) -> Data?)?) { self.id = id } } let tC = testClass(id: 1) { datas, val in return datas.first }
内容的提问来源于stack exchange,提问作者Bartosz Jarosz
相关产品推荐
相关产品推荐

