Swift, Parse и Xcode 6 beta6

Мой запрос к Parse теперь вызывает ошибку быстрого компилятора в Xcode 6 beta6 (см. ошибку ниже). Раньше он работал нормально (и мой пример прост и взят из документации Parse). Я изменил одну вещь из Xcode 6 beta 6: с "objects: AnyObject []!" на "объекты: [AnyObject]!" (из-за ошибки "Типы массивов теперь пишутся с скобками вокруг типа элемента")

query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if !(error != nil) {
            NSLog("Successfully retrieved \(objects.count) objects.")
            for object : PFObject! in objects { ... } ...

// ОШИБКА: тип [AnyObject] не может быть неявно преобразован в 'PFObject'. Вы имели в виду использование 'as' для принудительного понижения?

И если я форсирую понижение, как было предложено предыдущей ошибкой, я получаю еще одну ошибку:

for object : PFObject! in objects as PFObject {
       ...
}

// ОШИБКА: тип PFObject не соответствует протоколу SequenceType

И если я заменяю objects: [AnyObject]! на objects: [PFObject]!, я получаю следующую ошибку:

query.findObjectsInBackgroundWithBlock {
        (objects: [PFObject]!, error: NSError!) -> Void in
        if !(error != nil) {
            for object : PFObject! in objects {

// ОШИБКА: AnyObject не идентичен PFObject

ОТВЕТ НА ИСПРАВЛЕНИЕ ПРОБЛЕМЫ КОМПИЛЯТОРА

Правильный ответ приведен ниже (Xcode предложил приведение вниз к PFObject, в то время как понижение относится к «объектам», массиву):

for object : PFObject! in objects as [PFObject] {
       ...
}

ОБНОВЛЕНО ПРАВИЛЬНЫЙ ОТВЕТ для времени выполнения

Приведенный выше ответ исправлял проблему с компилятором, а не с выполнением. После общения с ребятами из Parse выяснилось, что их документация не актуальна, поскольку вышла бета-версия 6. Чтобы зациклить объекты PFObjects, возвращенные из запроса, просто выполните «для объекта в объектах {}»:

 query.findObjectsInBackgroundWithBlock {
        (objects: [PFObject]!, error: NSError!) -> Void in
        if (error == nil) {
           for object in objects {
            ...
            } ...
 }

person Tom - Lunabee.com    schedule 26.08.2014    source источник
comment
сделать [PFObject]! вместо [AnyObject]!   -  person A'sa Dickens    schedule 27.08.2014
comment
В этом случае я получаю следующую ошибку: AnyObject не идентичен PFObject в строке query.findObjectsInBackgroundWithBlock{   -  person Tom - Lunabee.com    schedule 27.08.2014
comment
О, я вижу, есть ли какой-то протокол, который необходимо использовать для использования AnyObject в качестве типа?   -  person A'sa Dickens    schedule 27.08.2014
comment
я бы пренебрег циклом, пока вы не получите объекты, тогда цикл будет очень простым.   -  person A'sa Dickens    schedule 27.08.2014
comment
А'са: Я не знаю. Этот фрагмент кода для асинхронного запроса Parse взят из документации Parse (и он работал над предыдущими бета-версиями Xcode 6...)   -  person Tom - Lunabee.com    schedule 27.08.2014
comment
в основном то, что это говорит, потому что === идентичен оператору, что PFObject === AnyObject является ложным, что верно, поэтому он ожидает, что вы будете иметь AnyObject как массив в этой точке, но синтаксический анализ ожидает вернуть тип ПФОбъект? это должно быть [PFObject]! указывающий массив... вы запрашиваете 1 объект? как явно первый элемент или последний элемент?   -  person A'sa Dickens    schedule 27.08.2014


Ответы (1)


Я считаю, что вы пытаетесь понизить массив. Что произойдет, если вы измените это:

for object : PFObject! in objects as PFObject {
       ...
}

К этому:

for object: PFObject in objects as [PFObject] {
       ...
}

Я также хотел указать, что это может не делать то, что вы намереваетесь:

if !(error != nil) {

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

ОБНОВЛЕНИЕ

Как указано в комментариях, Parse предлагает выполнить простой цикл for-in без какого-либо явного понижения.

for object in objects {}
person Logan    schedule 27.08.2014
comment
Вы правы, мой плохой: Xcode предложил мне приведение без скобок. Действительно, это объекты, массив, который я понижаю... - person Tom - Lunabee.com; 27.08.2014
comment
Это исправляло мою проблему с компиляцией, а не с выполнением. У меня был EXC_BAD_ACCESS в делегате приложения. После общения с ребятами из Parse бета-версия 6 оказала влияние на пользователей Parse for Swift. Документация не актуальна: нам нужно зациклить объекты с помощью for object in objects {...} - person Tom - Lunabee.com; 27.08.2014
comment
Спасибо за новость, Том! Это хорошая информация, я добавлю ее к ответу. - person Logan; 27.08.2014