"Empty collection literal requires an explicit type" error on Swift3

I have a variable on my class:

var list = []

and I use it on a function of my class:

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

It worked well on my project in Swift 2.3 but when I have updated it to XCode8 and Swift3 it gives to me the following error:

Empty collection literal requires an explicit type

so I have added a typecast to my list variable:

var list = [] as! NSArray

but it gives to me the following alert:

Forced cast of 'NSArray' to same type has no effect

I know that an alert does not broke the application but I would like to solve this error in a proper way.

Did someone got the same error and solved it properly?

Thanks in advance!

3

4 Answers

This error occurs since implicit conversions are abolished so you have to tell the compiler the explicit type (of the ArrayLiteral []):

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

The Swift 5 guided tour is pretty explicit about creating empty arrays or dictionaries: towards the end of the first section.

To create an empty array or dictionary, use the initializer syntax.

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

Update swift 4 :

var array = [] as [String]

You are mixing ObjectiveC (NSArray) and Swift (Array<T>). Items inside an NSArray are assumed to be NSObject and its subclasses, while Swift has no clue what T is since the array is empty and hence type inference doesn't work.

If you declare it like this:

var data: NSArray = []

there will be a conflict since var means mutable in Swift, but NSArray is immutable in ObjC. You can get around that by changing it to NSMutableArray, which is a subclass of NSArray:

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

If you want to keep data as Swift's Array, give it a type:

var data = [MyDataModel]()
// or
var data = [AnyObject]()
// usage:
chargeData(data: data as NSArray)
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like