Xcode中“Empty collection literal requires an explicit type”警告问题咨询
问题原因解析
第一段代码为啥合法?
第一段里的空集合[],编译器能从周围的代码里明确推断出它的类型:
- 比如你是把它赋值给已经声明好类型的变量:
let arr: [String] = [] - 或是作为参数传给一个参数类型明确的函数:
func process(_ items: [Int]) { ... }; process([])
这种情况下编译器不用猜就知道这是啥类型的集合,所以代码完全合法,不会有警告。
第二段代码为啥出警告?
第二段的空[]没有足够的信息让编译器判断它的类型,比如:
- 你把它赋值给了一个没声明类型的变量:
let emptyArr = [] - 或是赋值给了
Any/AnyObject类型的变量:let anyVal: Any = []
旧版Xcode里的Swift编译器会默认把这种无提示的空集合当成[Any]类型,但新版Swift为了更严谨的类型安全,不再做这种自动猜测,必须让你明确告诉它这是啥类型,所以就弹出了“Empty collection literal requires an explicit type”警告。
怎么修复这个警告?
根据不同的使用场景,有这几种办法:
- 给变量显式声明类型:如果是赋值给变量,直接写清楚集合的具体类型
// 修复前 let emptyArr = [] // 修复后 let emptyArr: [String] = [] // 换成你实际需要的类型,比如[Int]、自定义类型都可以 - 用
as给空字面量指定类型:直接在[]后面通过as说明类型// 修复前 let anyVal: Any = [] // 修复后 let anyVal: Any = [] as [String] - 函数参数场景:如果是传给函数的参数,要么确保函数签名能让编译器推断,要么显式转换类型
// 比如函数是 func handle(data: [Double]) { ... } // 修复前(如果上下文不够) handle(data: []) // 修复后 handle(data: [] as [Double])
内容的提问来源于stack exchange,提问作者Patrick Koning
相关产品推荐
相关产品推荐

