关于在 Swift 4 中返回 CGFloat 值

Posted

技术标签:

【中文标题】关于在 Swift 4 中返回 CGFloat 值【英文标题】:About return CGFloat value in Swift 4 【发布时间】: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 返回值

请帮帮我。

【问题讨论】:

【参考方案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()
  


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

【讨论】:

以上是关于关于在 Swift 4 中返回 CGFloat 值的主要内容,如果未能解决你的问题,请参考以下文章

由于 Swift 缺少 CGFloat 的隐式转换而造成的混乱

如何在 func swift 4 中编写关于比较布尔值的 func

swift 3 中 swift 2 的 CGFloat.random(min: CGFloat, max: CGFloat) 是啥?

如何在 Swift 中连接或合并数组?

Swift 基础组件之像素转 Point

Swift 基础组件之像素转 Point