Swift、Parse和Xcode 6 beta6

3

我现在向Parse发出的查询在Xcode 6 beta6中引发了Swift编译器错误(请参见下面的错误)。之前它一直正常工作(我的示例很简单,来自Parse的文档)。我从Xcode 6 beta 6中改变了一个东西:“objects: AnyObject[]!”变成了“objects:[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建议将downcast应用于"objects"数组,而不是PFObject):

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

更新后的正确执行时间答案

上述答案解决了编译问题而非执行问题。与Parse的工作人员交流后,他们的文档已经过时,因为beta 6已经发布。要循环遍历从查询返回的PFObjects对象,只需使用“for object in objects {}”:

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

使用 [PFObject]! 替代 [AnyObject]! - A'sa Dickens
在这种情况下,我会在query.findObjectsInBackgroundWithBlock {的行上收到以下错误:AnyObject与PFObject不相同 - Tom - Lunabee.com
哦,我明白了。在使用 AnyObject 作为类型时,是否需要遵循某些协议? - A'sa Dickens
在你能够获取对象之前,我会忽略循环,然后循环会变得非常容易。 - A'sa Dickens
A'sa:我不知道。这段异步Parse查询的代码来自Parse文档(并且在之前的Xcode 6测试版上工作得很好…) - Tom - Lunabee.com
基本上这是在说,因为 === 是一个完全相同的运算符,所以 PFObject === AnyObject 是假的,这是正确的,所以它期望你此时拥有 AnyObject 作为一个数组,但是 Parse 希望返回一个 PFObject 类型?应该是 [PFObject]! 表示一个数组... 你是在查询一个对象吗?比如明确地第一个或最后一个项目? - A'sa Dickens
1个回答

2
我相信您正在尝试将数组向下转型。如果您更改如下代码会发生什么:
for object : PFObject! in objects as PFObject {
       ...
}

转换为:

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

我想指出这可能不会做你打算做的事情:
if !(error != nil) {

在括号前面添加额外的感叹号会产生双重否定,可能会使您的意图模糊不清。

更新

正如评论中指出的那样,Parse建议使用简单的for-in循环而不需要任何显式的向下转换。

for object in objects {}

你说得对,我的错:Xcode建议我在向下转换时不加括号。实际上,这是一个数组"objects",我正在进行向下转换... - Tom - Lunabee.com
它解决了我的编译问题,而不是执行问题。我在App Delegate上遇到了EXC_BAD_ACCESS。与Parse的人聊天后,beta 6对于Swift用户对Parse产生了影响。文档不是最新的:我们需要使用for object in objects {...}循环对象。 - Tom - Lunabee.com
谢谢更新,汤姆!这是很好的信息,我会把它添加到答案中。 - Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接