【问题标题】:"[AnyObject]? is not convertible to 'NSArray'"[AnyObject]? 不能转换为 'NSArray'
【发布时间】:2015-08-06 18:46:24
【问题描述】:

这里我有另一个问题。

当我通过我的应用程序编码时,我正在使用 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 的查询有关?

【问题讨论】:

  • 试试(objects as NSArray?)?.lastObject as! PFUser。无论如何,Swift 数组还有一个 last 属性。所以你可以使用let user:PFUser? = objects.last as? PFUser
  • 当我尝试这样做时,它显示“从 '[AnyObject] 投射?”到不相关的类型 'NSArray' 总是失败"

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


【解决方案1】:

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

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

通过添加一个!如下

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

你问题的第二部分:

替换

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

通过

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

【讨论】:

  • 做到了!尝试此操作后,它在帖子上显示了用户名!谢谢(:
  • 使用这个可能更 Swift-y:let user = (objects as? [PFUser])?.last 这样应用程序在objects == nil 时不会崩溃。
  • @nielsbot 从安全的角度来看,我同意你的看法。在研究 Parse.com 的文档和示例时,我得出结论,万一 error == nil 对象永远不会是 nil,所以我认为立即打开它是安全的。但重新考虑我确实更喜欢你的建议。
【解决方案2】:

试试这个:

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

看起来 objects 是 AnyObject 的可选数组。您可以将其转换为可选的 NSArray。

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

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

相反。你的内部条件代码可以写成

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

一些解释:

User 是一个可选的 PFUser,一个 PFUser 引用,它是一个 PFUser 实例或什么都没有。类型是可选。 (也可以写成PFUser?)。

objectsnilnil 时,

objects?.last 的计算结果为 objects.last

现在 user 指的是 objects 中的最后一个 PFUser 实例,或者什么都没有(nil)。

usernilnil 时,

user?.username 的计算结果为 user.username

最后,?? 操作符如果不是 nil 则返回左侧表达式,如果是则返回右侧表达式。 IE。如果用户名是 nil,则使用空字符串代替 ("")

【讨论】:

  • 好吧,这有点奏效。如果我在引号中输入“用户名”,它会显示“用户名”。现在我只需要弄清楚如何在那里获取用户名
  • 我添加了一些解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多