"Пустой набор литералов требует явного типа" ошибки на Swift3

У меня есть переменная в моем классе:

var list = []

и я использую его для функции моего класса:

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

Он хорошо работал в моем проекте в Swift 2.3, но когда я обновил его до XCode8 и Swift3, он дал мне следующую ошибку:

Пустое литерал коллекции требует явного типа

поэтому я добавил приведение к моей переменной списка:

var list = [] as! NSArray

но он дает мне следующее предупреждение:

Принудительный приведение 'NSArray' к тому же типу не имеет эффекта

Я знаю, что предупреждение не нарушает работу приложения, но я хотел бы правильно решить эту ошибку.

Кто-то получил ту же ошибку и решил ее правильно?

Спасибо заранее!

Ответ 1

Эта ошибка возникает, поскольку неявные преобразования отменены, поэтому вы должны сообщить компилятору явный тип (ArrayLiteral []):

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

Ответ 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

Обновить скорость 4:

var array = [] as [String]

Ответ 4

В руководстве Swift 5 довольно подробно рассказывается о создании пустых массивов или словарей: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#ID461 ближе к концу первого раздела.

Чтобы создать пустой массив или словарь, используйте синтаксис инициализатора.

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