Упадок из [PFObject]? to [PFObject] разворачивает только опции, вы хотели использовать !

У меня появляется ошибка в Xcode, говорящая Downcast from '[PFObject]?' to '[PFObject]' разворачивает только необязательные параметры; Вы хотели использовать "!"?

    var iDArray = [String]()
var nameArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let ObjectIDQuery = PFQuery(className: "Songs")
    ObjectIDQuery.findObjectsInBackgroundWithBlock({
        (objectsArray: [PFObject]?, error: NSError?) -> Void in


        var objectIDs = objectsArray as! [PFObject]
        for i in 0...objectIDs.count{
            self.iDArray.append(objectIDs[i].valueForKey("objectID") as! String)

            NSLog("\(objectIDs)")

Изображение файла Xcode


person ac.coelho    schedule 12.03.2016    source источник


Ответы (3)


В этой ситуации лучше использовать guard. Код ниже безопасно разворачивает необязательный objectsArray и, если необязательный равен nil, дальнейший код выполняться не будет. Также вы можете написать эту часть кода немного красивее :)

ObjectIDQuery.findObjectsInBackgroundWithBlock() { (objectsArray: [PFObject]?, error: NSError?) -> Void in

        guard let objectIDs = objectsArray else { return }

        self.iDArray += objectIDs.map { $0.valueForKey("objectID") as! String }
}
person Misternewb    schedule 12.03.2016

Вы, вероятно, имели в виду использовать "!". Измените эту строку:

var objectIDs = objectsArray as! [PFObject]

к этому:

var objectIDs = objectsArray!

Поскольку вы просто разворачиваете массив, нет необходимости его приводить.

person tktsubota    schedule 12.03.2016

Это сообщение означает, что приведение вниз не требуется, потому что компилятор знает тип [PFObject]? — как вы можете видеть в сигнатуре блока.

Рекомендуемый способ - сначала обработать ошибку. Если это ноль, вы можете безопасно развернуть необязательный

ObjectIDQuery.findObjectsInBackgroundWithBlock({
    (objectsArray: [PFObject]?, error: NSError?) -> Void in

    if error != nil {
     // handle the error
    } else {
      for anObject in objectsArray! {
         self.iDArray.append(anObject["objectID"] as! String)
      }
    }
person vadian    schedule 12.03.2016