фатальная ошибка: неожиданно обнаружен nil при разворачивании необязательного значения. Быстрый

Я новичок в Swift. Мой вопрос в том, что я не уверен, как развернуть необязательное значение. Когда я печатаю object.objectForKey ("profile_picture"), я вижу Optional(<PFFile: 0x7fb3fd8344d0>).

    let userQuery = PFUser.query()
    //first_name is unique in Parse. So, I expect there is only 1 object I can find.
    userQuery?.whereKey("first_name", equalTo: currentUser)
    userQuery?.findObjectsInBackgroundWithBlock({ (objects: [PFObject]?, error: NSError?) -> Void in
        if error != nil {
        }
        for object in objects! {
            if object.objectForKey("profile_picture") != nil {
                print(object.objectForKey("profile_picture"))
                self.userProfilePicture.image = UIImage(data: object.objectForKey("profile_pricture")! as! NSData)
            }
        }
    })

person Pak Ho Cheung    schedule 24.01.2016    source источник


Ответы (1)


Вы бы использовали if let для выполнения «необязательного связывания», выполняя блок только в том случае, если рассматриваемый результат не является nil (и привязывая переменную profilePicture к развернутому значению в процессе).

Это было бы примерно так:

userQuery?.findObjectsInBackgroundWithBlock { objects, error in
    guard error == nil && objects != nil else {
        print(error)
        return
    }
    for object in objects! {
        if let profilePicture = object.objectForKey("profile_picture") as? PFFile {
            print(profilePicture)
            do {
                let data = try profilePicture.getData()
                self.userProfilePicture.image = UIImage(data: data)
            } catch let imageDataError {
                print(imageDataError)
            }
        }
    }
}

Или, если вы хотите получать данные асинхронно, возможно:

userQuery?.findObjectsInBackgroundWithBlock { objects, error in
    guard error == nil && objects != nil else {
        print(error)
        return
    }
    for object in objects! {
        if let profilePicture = object.objectForKey("profile_picture") as? PFFile {
            profilePicture.getDataInBackgroundWithBlock { data, error in
                guard data != nil && error == nil else {
                    print(error)
                    return
                }
                self.userProfilePicture.image = UIImage(data: data!)
            }
        }
    }
}

Было бы что-то в этом роде, используя if let, чтобы развернуть это необязательное. Затем вы должны получить NSData, связанный с этим объектом PFFile (предположительно, из метода getData или getDataInBackgroundWithBlock).

См. Дополнительное связывание в языке программирования Swift.

person Rob    schedule 25.01.2016
comment
Оно работает. Не могли бы вы подробнее объяснить, что если пусть будет? - person Pak Ho Cheung; 25.01.2016
comment
if let является необязательной привязкой, т.е. выполнение блока выполняется только в том случае, если рассматриваемый результат не является nil (и привязка переменной profilePicture к развернутому значению в процессе). Очевидно, что если бы объект был nil, он просто перескочил бы за блок if let. См. Необязательная привязка в языке программирования Swift. - person Rob; 25.01.2016
comment
OK. Понятно. Спасибо:) - person Pak Ho Cheung; 25.01.2016