Parse & Xcode 6.4 使用 Swift 1.2 解包选项时出现问题

Parse & Xcode 6.4 problems unwrapping optionals with Swift 1.2

升级到 xcode 6.4 后,我在解包可选商品时遇到问题。这是 运行 这行代码时出现的错误:

query.whereKey("follower", equalTo: PFUser.currentUser()!.objectId!)

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

我知道在 xcode 的新更新中,您必须更加小心地展开可选值,但我不确定需要进行哪些更改才能使 swift 配合。我已经尝试了 S/O 上建议的许多不同方法,但还没有找到一个可行的方法。这是我的完整代码:

谢谢!!

import UIKit
import Parse

class TableViewController: UITableViewController {

    var usernames = [""]
    var userids = [""]
    var isFollowing = ["":false]

    override func viewDidLoad() {
        super.viewDidLoad()

       var query = PFUser.query()

        query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

            if let users = objects {

                self.usernames.removeAll(keepCapacity: true)
                self.userids.removeAll(keepCapacity: true)
                self.isFollowing.removeAll(keepCapacity: true)

                for object in users {

                    if let user = object as? PFUser {

                        if user.objectId! != PFUser.currentUser()?.objectId {

                            self.usernames.append(user.username!)
                            self.userids.append(user.objectId!)

                            var query = PFQuery(className: "followers")

                            ***query.whereKey("follower", equalTo: PFUser.currentUser()!.objectId!)***
                            query.whereKey("following", equalTo: user.objectId!)

                            query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

                                if let objects = objects {

                                    if objects.count > 0 {

                                        self.isFollowing[user.objectId!] = true

                                        } else {

                                        self.isFollowing[user.objectId!] = false

                                    }
                                }

                                if self.isFollowing.count == self.usernames.count {

                                    self.tableView.reloadData()

                                }


                            })



                        }
                    }

                }



            }



        })


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return usernames.count
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell

        cell.textLabel?.text = usernames[indexPath.row]

        let followedObjectId = userids[indexPath.row]

        if isFollowing[followedObjectId] == true {

            cell.accessoryType = UITableViewCellAccessoryType.Checkmark

        }


        return cell
    }


    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!

        let followedObjectId = userids[indexPath.row]

        if isFollowing[followedObjectId] == false {

            isFollowing[followedObjectId] = true

            cell.accessoryType = UITableViewCellAccessoryType.Checkmark

            var following = PFObject(className: "followers")
            following["following"] = userids[indexPath.row]
            following["follower"] = PFUser.currentUser()?.objectId

            following.saveInBackground()

        } else {

            isFollowing[followedObjectId] = false

            cell.accessoryType = UITableViewCellAccessoryType.None

            var query = PFQuery(className: "followers")

            query.whereKey("follower", equalTo: PFUser.currentUser()!.objectId!)
            query.whereKey("following", equalTo: userids[indexPath.row])

            query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

                if let objects = objects {

                    for object in objects {

                        object.deleteInBackground()

                    }
                }


            })



        }

    }
}

您可以使用 Optional Binding 访问登录用户,以确保在将其用作查询参数之前它不是 nil

所以你应该改行:

query.whereKey("follower", equalTo: PFUser.currentUser()!.objectId!)

有:

if let userObj = PFUser.currentUser()?.objectId {
    query.whereKey("follower", equalTo: userObj)
}

现在这将解决您的错误并防止您的应用程序崩溃,但也许您应该以某种方式重组您的应用程序以确认用户在到达此 UITableViewController 时无论如何都已登录。

在任何情况下,您仍应使用 Optional Binding 来防止潜在的崩溃。