Swift3上的“空集合文字需要显式类型”错误

时间:2016-09-14 11:23:56

标签: ios swift3

我班上有一个变量:

var list = []

我在课堂上使用它:

func chargeData (data: NSArray){
    list = data
}

我在Swift 2.3的项目中效果很好,但当我将其更新为XCode8Swift3时,它给了我以下错误:

  

空集合文字需要显式类型

所以我在列表变量中添加了一个类型转换:

var list = [] as! NSArray

但它给了我以下警告:

  

将'NSArray'强制转换为相同类型无效

我知道警报没有破坏应用程序,但我想以正确的方式解决此错误。

有人得到了同样的错误并正确解决了吗?

提前致谢!

4 个答案:

答案 0 :(得分:27)

发生此错误,因为隐式转换被废除,因此您必须告诉编译器显式类型(ArrayLiteral []):

var list: NSArray = []
// or
var list = [] as NSArray

答案 1 :(得分:4)

更新swift 4:

{{1}}

答案 2 :(得分:2)

您正在混合ObjectiveC(NSArray)和Swift(Array<T>)。假设NSArray内的项目是NSObject及其子类,而Swift不知道T是什么,因为数组是空的,因此类型推断不起作用。

如果你这样声明:

var data: NSArray = []

会发生冲突,因为var在Swift中意味着可变,但NSArray在ObjC中是不可变的。您可以将其更改为NSMutableArray,这是NSArray的子类:

let data = NSMutableArray() // note that we don't need var here
                            // as NSMutableArray is already mutable

如果您想将data保留为Swift的Array,请为其指定类型:

var data = [MyDataModel]()
// or
var data = [AnyObject]()

// usage:
chargeData(data: data as NSArray)

答案 3 :(得分:1)

Swift 5 导览非常明确地说明了如何创建空数组或字典:https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#ID461接近第一节。

  

要创建一个空数组或字典,请使用初始化程序语法。

let emptyArray = [String]()
let emptyDictionary = [String: Float]()