Ответ 1
Эта ошибка возникает, поскольку неявные преобразования отменены, поэтому вы должны сообщить компилятору явный тип (ArrayLiteral
[]
):
var list: NSArray = []
// or
var list = [] as NSArray
У меня есть переменная в моем классе:
var list = []
и я использую его для функции моего класса:
func chargeData (data: NSArray){
list = data
}
Он хорошо работал в моем проекте в Swift 2.3
, но когда я обновил его до XCode8
и Swift3
, он дал мне следующую ошибку:
Пустое литерал коллекции требует явного типа
поэтому я добавил приведение к моей переменной списка:
var list = [] as! NSArray
но он дает мне следующее предупреждение:
Принудительный приведение 'NSArray' к тому же типу не имеет эффекта
Я знаю, что предупреждение не нарушает работу приложения, но я хотел бы правильно решить эту ошибку.
Кто-то получил ту же ошибку и решил ее правильно?
Спасибо заранее!
Эта ошибка возникает, поскольку неявные преобразования отменены, поэтому вы должны сообщить компилятору явный тип (ArrayLiteral
[]
):
var list: NSArray = []
// or
var list = [] as NSArray
Вы смешиваете 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)
Обновить скорость 4:
var array = [] as [String]
В руководстве Swift 5 довольно подробно рассказывается о создании пустых массивов или словарей: https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#ID461 ближе к концу первого раздела.
Чтобы создать пустой массив или словарь, используйте синтаксис инициализатора.
let emptyArray = [String]()
let emptyDictionary = [String: Float]()