Swift 由于赋值语句的错误放置,函数始终返回nil

Swift 由于赋值语句的错误放置,函数始终返回nil,swift,function,return,Swift,Function,Return,在这样一个函数中,我得到了一个nil值,但我不明白为什么。中间的代码返回一个图像(我确信它,我也用一些打印语句检查)。我不知道它怎么可能总是返回零。就像它忽略了在中间运行的所有代码,只考虑第一个和最后一个语句。 func getImagesDownloaded(reference: StorageReference) -> UIImage { var imagePassedIn : UIImage? reference.getData(maxSize: 10*1024*10

在这样一个函数中,我得到了一个nil值,但我不明白为什么。中间的代码返回一个图像(我确信它,我也用一些打印语句检查)。我不知道它怎么可能总是返回零。就像它忽略了在中间运行的所有代码,只考虑第一个和最后一个语句。

func getImagesDownloaded(reference: StorageReference) -> UIImage {
    var imagePassedIn : UIImage?
    reference.getData(maxSize: 10*1024*1024) { (data, error) in

        guard let imageObject = UIImage(data: data!) else {print("Error has occurred: \(String(describing: error?.localizedDescription))"); return}
        imagePassedIn = imageObject
    }
    if imagePassedIn == nil {
        print("Error, getImagesDownloaded is not working")
    }
    return imagePassedIn!
}

您使用的是闭包,在执行nil检查时,可能不会返回imageObject。 Swift是逐行执行的,当您有异步代码时,它会执行下一行,而不等待结果


您应该在闭包中移动imagePassedIn检查。

问题在于
StorageReference.getData
是一个异步函数,但您尝试同步返回一个值。您需要使用完成处理程序返回异步检索的值

func getImagesDownloaded(reference: StorageReference, completion: (UIImage?,Error?)->()) {
    reference.getData(maxSize: 10*1024*1024) { (data, error) in
        guard error == nil, let data = data else {
            completion(nil,error)
            return
        }
        guard let image = UIImage(data: data) else {
            completion(nil, FirebaseErrors.expectedImage)
            return
        }
        completion(image,nil)
    }
}

enum FirebaseErrors: Error {
    case expectedImage
}
然后你需要像这样使用它:

getImagesDownloaded(reference: yourStorageReference, completion: { image, error in
    guard let image = image, error == nil else {
        print(error)
        return
    }
    // Assign your image to a UIImageView or do anything else with it inside the closure (before the ending `}`)
    yourImageView.image = image
})

您正在完成块内设置
imagePassedIn
。这意味着当您准备好设置它时,您已经重新调整了它

简而言之,当使用完成块时,下面的代码不会为了执行而等待它完成

将您的函数更新为:

func getImagesDownloaded(reference: StorageReference, _ completion: (UIImage) -> ()) {
    reference.getData(maxSize: 10*1024*1024) { (data, error) in

        guard let data = data, let imageObject = UIImage(data: data) else {print("Error has occurred: \(String(describing: error?.localizedDescription))"); return}
        completion(imageObject)
    } else {
        print("Error, getImagesDownloaded is not working")
    }
}

这里需要完成处理程序。你可以查一下,谢谢!我会调查的。你刚刚给出了你的第1000个答案,恭喜:我怎样才能从中返回值?下面的陈述行得通吗?让imageDownloaded=self.getImagesDownloaded(引用:storagePath,完成:{(图像,错误)in if error==nil{return image}否则{print(“error:.localizedDescription]”)向上投票!为了便于调整,您是否也要给出使用示例?是否要以这种方式返回UIImage?让imageDownloaded=self.getImagesDownloaded(引用:storagePath,{(image)in return image}),它不会返回,因为它是异步的。而是调用并使用“返回的”图像,如:self.getimagesdownload(reference:storagePath){image in//do you want with
image
}