我在这里谈到另一个问题。
当我通过我的应用编码时,我使用的是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的查询有关吗?
答案 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 ,请改用空字符串("" )