" [AnyObject]?不能转换为NSArray'

时间:2015-08-06 18:46:24

标签: ios iphone swift cocoa-touch parse-platform

我在这里谈到另一个问题。

当我通过我的应用编码时,我使用的是Parse Framework,并且我使用查询来获取数据库中的用户名:

var showUsername:PFQuery = PFUser.query()!
    //showUsername.whereKey("objectId", equalTo: post.objectForKey("user")!.objectId)

    showUsername.whereKey("objectId", equalTo: post.objectForKey("user")!)

    showUsername.findObjectsInBackgroundWithBlock{
        (objects: [AnyObject]?, error: NSError?) -> Void in

         if error == nil{
            let user:PFUser = (objects as NSArray!).lastObject as! PFUser
            cell.usernameLabel.text = user.username
        }

    }

我遇到了这两行代码的问题:

//showUsername.whereKey("objectId", equalTo: post.objectForKey("user")!.objectId)

这个我对它进行了评论,因为它说.objectID是错误的,所以如果我把它拿出来,它说没关系。所以我想知道它的功能是否相同???

而且,这一行:

let user:PFUser = (objects as NSArray!).lastObject as! PFUser

它在Xcode上显示是正确的,但是当我运行应用程序时,由于该错误说明" [AnyObject],它会因为该行代码而冻结和崩溃?不能兑换为NSArray'

有什么方法可以解决这个问题吗?

我已经尝试了其他链接所说的内容:

" '[AnyObject]?' is not convertible to 'NSArray'"

" How to set the current user in cell? Swift, Parse"

我的代码中没有错误,它运行,但用户名不会更改为实际的用户名,它仍然说"标签"

除非与缺少.objectID的查询有关吗?

2 个答案:

答案 0 :(得分:2)

问题的第一部分(您注释掉的那一行):

showUsername.whereKey("objectId", equalTo: post.objectForKey("user")!.objectId)

通过添加一个来解开objectId!如下

showUsername.whereKey("objectId", equalTo: post.objectForKey("user")!.objectId!)

问题的第二部分:

替换

let user:PFUser = (objects as NSArray!).lastObject as! PFUser

通过

let user = (objects as! [PFUser]).last

答案 1 :(得分:1)

试试这个:

(objects as? NSArray)?.lastObject as! PFUser

看起来对象是AnyObject的可选数组。您可以将其强制转换为可选的NSArray。

无论如何,Swift数组也有最后一个属性。你可以用

`let user:PFUser? = objects.last as? PFUser`

代替。您的内部条件代码可以写为

let user = objects?.last as? PFUser
cell.usernameLabel.text = user?.username ?? ""

一些解释:

用户是一个可选的PFUser,一个PFUser参考,它是一个PFUser实例,或者什么也不是。类型为可选。 (也可以写成 PFUser?)。

对象 nil

objects?.last评估为objects.last,否则 nil

现在用户是指对象中的最后一个 PFUser 实例,或者没有( nil )。

用户 nil 时,

user?.username评估为user.username,否则 nil

最后,??运算符返回左侧表达式(如果它是非nil),右侧表达式(如果是非零)。即如果用户名是 nil ,请改用空字符串(""