【问题标题】:Unresolved identified error in swift do-catchswift do-catch 中未解决的已识别错误
【发布时间】:2025-12-03 04:00:01
【问题描述】:

感谢社区,我昨天在迁移到 swift 2 时解决了错误处理问题。这些更正实际上产生了一个新错误,我不知道如何更正它。以下是当前代码,它在提要中显示一些图片帖子:

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)

ParseHelper.timelineRequestForCurrentUser {
  (result: [AnyObject]?, error: NSError?) -> Void in
  self.posts = result as? [Post] ?? []

  for post in self.posts {
    do
    {
      let data = try post.imageFile?.getData()
    }
    catch
    {
      print("Error: \(error)")
      //Handle the error instead of print probably
    }
    post.image = UIImage(data: data!, scale:1.0)  --> where I get the error message "Use of unresolved identified 'data'"

  }

  self.tableView.reloadData()
}

另外,我在之前的方法中提到的 ParseHelper 文件中出现了一个新错误。

static func timelineRequestForCurrentUser(completionBlock: PFArrayResultBlock) {
let followingQuery = PFQuery(className: "Follow")
followingQuery.whereKey("fromUser", equalTo:PFUser.currentUser()!)

let postsFromFollowedUsers = Post.query()
postsFromFollowedUsers!.whereKey("user", matchesKey: "toUser", inQuery: followingQuery)

let postsFromThisUser = Post.query()
postsFromThisUser!.whereKey("user", equalTo: PFUser.currentUser()!)

let query = PFQuery.orQueryWithSubqueries([postsFromFollowedUsers!, postsFromThisUser!])
query.includeKey("user")
query.orderByDescending("createdAt")

// 3
query.findObjectsInBackgroundWithBlock(completionBlock) --> I get an error message too here "Cannot convert value of type 'PFArrayResultBlock' to expected argument type 'PFQueryArrayResultBlock?'"

【问题讨论】:

标签: jquery parse-platform error-handling swift2


【解决方案1】:

对 Swift 没有太多经验,但编译器输出很有意义。首先,let data 声明的范围仅限于 do/catch 的 do 块。为了让catch 块使用数据,必须在 do/catch 周围的范围内重新声明数据...

let data : NSData? // assuming type is NSData (my point here is about scope)
do {
    data = try post.imageFile?.getData()
} catch {
    print("Error: \(error)")
    //Handle the error instead of print probably
}
// now data is in scope here...
post.image = UIImage(data: data!, scale:1.0)

第二个问题似乎是完成块在这里被声明为PFArrayResultBlock 类型的函数参数:

static func timelineRequestForCurrentUser(completionBlock: PFArrayResultBlock)

...但是 parse 期望将 PFQueryArrayResultBlock 类型的块传递给 findObjectsInBackground。看起来它们之间的区别是数组元素的预期类型略有不同([PFObject]? 用于查询,[AnyObject]?)。

【讨论】:

  • 非常感谢。替换 PFObject 解决了 completionBlock 的问题。我仍在为 post.image 苦苦挣扎。我已经尝试过您的解决方案,但仍然出现相同的错误:无法分配类型“UIImage?”的值输入'Observable'(又名'Observable>')。代码现在看起来像这样: let data : NSData? do { data = try post.imageFile?.getData() } catch { print("Error: (error)") //处理错误而不是打印可能 } post.image = UIImage(data: data!, scale:1.0 )
  • 这听起来与 OP 中表达的错误不同。听起来它发生在 post.image 分配上,并且 post.image 没有完全声明为 UIImage。该代码也存在问题,因为它使用的 getData() 版本是阻塞的。即使调用一次,更不用说循环调用会导致 UI 冻结。
  • 前面定义post.image的代码,即当你从手机中选择图像时(右上方): func takePhoto() { // 实例化拍照类,为拍照时提供回调被选中 photoTakingHelper = PhotoTakingHelper(viewController: self.tabBarController!) { (image: UIImage?) in let post = Post() // 1 post.image.value = image! post.uploadPost() } } 我应该换一种方式吗?
【解决方案2】:

这就是我纠正问题的方式:

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated) 
ParseHelper.timelineRequestForCurrentUser { 
(result: [PFObject]?, error: NSError?) -> Void in 
self.posts = result as? [Post] ?? [] 
self.tableView.reloadData() } }

【讨论】:

    最近更新 更多