想从有时可能为空的解析中查询一个数组,但 xcode 不允许我这样做

want to query an array from parse that might be empty sometimes but xcode won't let me

func reloadFriendList() {
    var query = PFQuery(className:"userFriendClass")
    query.whereKey("username", equalTo:user!.username!)
    query.findObjectsInBackgroundWithBlock {
        (objects: [PFObject]?, error: NSError?) -> Void in

        if error == nil {

            for object in objects! {
                self.friendList = object["friends"] as! [String]
                print(self.friendList)
                self.reloadTableView()
            }
        } else {

            // Log details of the failure
            print("Error: \(error!) \(error!.userInfo)")
        }

    }
}

我想保存对象["friends"],这是一个用用户名解析成的数组

var friendList = [String]()

但我收到错误:"fatal error: unexpectedly found nil while unwrapping an Optional value", 当数组为空时,这意味着用户没有任何朋友,但当用户至少有 1 个或更多朋友时,它工作正常。

您需要准备好代码来处理 nil 情况和“objects”为空数组的情况。

如果这是我的代码,我会这样做:

for object in objects {
    if let friendList = object["friends"]
    {
         self.friendList = friendList
    } else {
         // make sure that your class's `friendList` var is declared as an optional
         self.friendList = [String]()
    }
}

由于 objects 是可选的并且可能是 nil,您需要安全地解包它。一种方法是使用 nil 合并运算符 来展开它,或者如果 objectsnil 则替换一个空数组。您可以再次使用它来安全地解包好友列表:

for object in objects ?? [] {
    self.friendList = (object["friends"] as? [String]) ?? []

您还可以使用可选绑定 if let 来安全地解包:

if let unwrappedObjects = objects {
    for object in unwrappedObjects {
        if let friends = object["friends"] as? [String] {
            self.friendsList = friends
        } else {
            // no friends :-(
            self.friendsList = []
        }
    }
}