我班上有一个变量:
var list = []
我在课堂上使用它:
func chargeData (data: NSArray){
list = data
}
我在Swift 2.3
的项目中效果很好,但当我将其更新为XCode8
和Swift3
时,它给了我以下错误:
空集合文字需要显式类型
所以我在列表变量中添加了一个类型转换:
var list = [] as! NSArray
但它给了我以下警告:
将'NSArray'强制转换为相同类型无效
我知道警报没有破坏应用程序,但我想以正确的方式解决此错误。
有人得到了同样的错误并正确解决了吗?
提前致谢!
答案 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]()