Подтвердить что ты не робот

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"? для ввода "Массив"

4b9b3361

Ответ 1

Чтобы передать данные в массив:

var twDataArray = (twData as! NSArray) as Array

В приведенном выше коде выше twData добавляется NSArray, а затем к Array с помощью привязки мостов. Модификация - это особый тип приведения, который преобразует в него тип Objective-C _ObjectiveCBridgeable, совместимый с Swift.

(Обратите внимание, что мне не нужно писать Array<AnyObject>, потому что элемент AnyObject выводится в мостинге с NSArrayArray)

Обратите внимание, что приведенное выше значение является принудительным нажатием. Используйте это, только если вы абсолютно уверены, что 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>.