解析& Xcode 6.4使用Swift 1.2展开选项的问题

时间:2015-07-14 18:24:42

标签: swift parsing null

升级到xcode 6.4后,我无法解开可选项。这是我在运行这行代码时遇到的错误:

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

致命错误:在展开Optional值时意外发现nil   (LLDB)

我知道,对于xcode的新更新,您必须更加谨慎地展开选项,但我不确定我需要做出哪些更改才能快速合作。我已经尝试了许多不同的方式,这些方法在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()

                    }
                }


            })



        }

    }
}

1 个答案:

答案 0 :(得分:0)

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

所以你应该换行:

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

使用:

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

现在这将解决您的错误并防止您的应用崩溃,但也许您应该重新构建您的应用,以确认用户已登录,无论何时到达此UITableViewController

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