AnyObject to Array?
Я использую NSJSONSerialization
так:
let twData: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)
Это дает мне AnyObject?
.
Отсюда я хочу преобразовать его в Array<Dictionary<String,String>>
Я пробовал все виды, приводя к этому:
var twDataArray: Array<Dictionary<String,String>>? = twData? as? Array<Dictionary<String,String>>
который просто дает ошибку:
Тип 'Array > ' не соответствует протоколу 'AnyObject'.
И добавив более простую версию:
var twDataArray = twData as Array
дает ошибку:
Невозможно преобразовать тип выражения "AnyObject"? для ввода "Массив"
Ответы
Ответ 1
Чтобы передать данные в массив:
var twDataArray = (twData as! NSArray) as Array
В приведенном выше коде выше twData
добавляется NSArray
, а затем к Array
с помощью привязки мостов. Модификация - это особый тип приведения, который преобразует в него тип Objective-C _ObjectiveCBridgeable
, совместимый с Swift.
(Обратите внимание, что мне не нужно писать Array<AnyObject>
, потому что элемент AnyObject
выводится в мостинге с NSArray
→ Array
)
Обратите внимание, что приведенное выше значение является принудительным нажатием. Используйте это, только если вы абсолютно уверены, что twData
будет экземпляром NSArray
. В противном случае используйте необязательный листинг.
var twDataArray = (twData as? NSArray) as Array?
Ответ 2
Попробуйте следующее: вы можете выполнять итерацию по массиву, как показано ниже.
for element in twData as! Array<AnyObject> {
print(element)
}
Ответ 3
Это работает на детской площадке:
var data: Array<Dictionary<String,String>>? = twData as? Array<Dictionary<String, String>>
отличие от вашего кода заключается в том, что twData
не требует ?
в конце - это необязательно, поэтому оператор as?
позаботится о проверке того, что это может быть случай для массива словарей - Само собой разумеется, что если nil, as?
будет оценивать значение nil
Ответ 4
let twData: Any = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &dataError)
Не используйте AnyObject
. Используйте Any
вместо AnyObject
. Это будет работать нормально. AnyObject
предназначен для всех ссылочных типов, а Array является типом значений. Вот почему это приходит. Измените это на Any
.
Ответ 5
Как вы уже знаете, это тип String, который вы вставляете в нечто трансформируемое, выполните следующие действия:
if let twoDataArray = twData as? Array<Dictionary<String, String>>{
for data in twoDataArray{
print(data)
}
}
Это будет защищать вас от аварийного приложения, если словарь не имеет тип <String,String>
.