【问题标题】:About return CGFloat value in Swift 4关于在 Swift 4 中返回 CGFloat 值
【发布时间】:2018-10-26 01:12:07
【问题描述】:

下载图片后,我创建了一个返回图片垂直值的函数。

但是,图像的垂直值将失败并返回 CGFloat 值。

此源代码下载后返回。

extension HomeViewController : PinterestLayoutDelegate
{
    func collectionView(_ collectionView: UICollectionView, heightForPhotoAtIndexPath indexPath:IndexPath) -> CGFloat
    {
        let arts = self.artList

        let model = arts![indexPath.row]

        let urlString = model.url!
        let urll = NSURL(string: urlString)

        return downloadImage(from: urll! as URL)
    }
}

extension HomeViewController
{
    func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ())
    {
        URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
    }

    func downloadImage(from url: URL) -> CGFloat
    {
        getData(from: url)
        { data, response, error in
        guard let data = data, error == nil else { return }
            {
                let image = UIImage(data: data)
                let heightInPoints = image!.size.height
                return heightInPoints
            }
        }
    }
}

但我收到一个错误

return heightInPoints

错误状态

void 函数中出现意外的非 void 返回值

请帮帮我。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    问题是你想在完成块内返回一个值,你需要

    func downloadImage(from url: URL,completion(_ value:CGFloat) -> Void )
    {
        getData(from: url)
        { data, response, error in
        guard let data = data, error == nil else { return }
            {
                let image = UIImage(data: data)
                let heightInPoints = image!.size.height
                completion(heightInPoints)
            }
        }
    }
    

    顺便说一句,你不能这样做

    return downloadImage(from: urll! as URL)
    

    heightForPhotoAtIndexPath 内部,因为 downloadImage 是异步方法,它的响应取决于网络状态,而不是在代码中串行,它的调用看起来像

    // array of heights
    var arr = [CGFloat]()
    let urll = URL(string: urlString)
    downloadImage(from: urll!) { (value) in 
      print(value)
      // append the value to it's corresponding index in an array of floats
      DispatchQueue.main.async {
        self.collectionview.reloadData()
      }
    }
    

    如果可能,您需要为图像提供预定义的高度列表,如果没有,则获取所有高度然后刷新集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多