【问题标题】:Cannot find an initializer for type 'CGSize' that accepts an argument list of type '(() -> _)' in Swift Project在 Swift Project 中找不到接受类型为“(()-> _)”的参数列表的类型“CGSize”的初始化程序
【发布时间】:2015-04-24 19:54:57
【问题描述】:

我正在学习斯坦福大学的课程并收到此错误:

Cannot find an initializer for type 'CGSize' that accepts an argument list of type '(() -> _)' 

本课程仅在几个月前教授,但使用的是 Xcode 6.2 而不是 Xcode 6.3。我需要采取哪些不同的措施来纠正此错误?

这是第 12 课 - 动态动画 - http://web.stanford.edu/class/cs193p/cgi-bin/drupal/

import UIKit

class DropItViewController: UIViewController {


    @IBOutlet weak var gameView: UIView!

    var dropsPerRow = 10

    var dropSize = CGSize {
        let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
        return CGSize(width: size, height: size)
    }

    @IBAction func drop(sender: UITapGestureRecognizer) {
        drop()
    }

    func drop() {
        var frame = CGRect(origin: CGPointZero, size: dropSize)
        frame.origin.x = CGFloat.random(dropsPerRow) * dropSize.width

        let dropView = UIView(frame: frame)
        dropView.backgroundColor = UIColor.random

        gameView.addSubview(dropView)
     }
    }

    private extension CGFLoat {
    static func random(max: Int) -> CGFloat {
        return CGFloat(arc4random() % UInt32(max))

    }
    }

    private extension UIColor {
    class var random: UIColor {
        switch arc4random()%5 {
        case 0: return UIColor.greenColor()
        case 1: return UIColor.blueColor()
        case 2: return UIColor.orangeColor()
        case 3: return UIColor.redColor()
        case 4: return UIColor.purpleColor()
        default: return UIColor.blackColor()

    }
}

}

【问题讨论】:

  • 你写错了 CGFloat。不是 CGFLoat 而是 CGFloat。
  • 谢谢,我对这个还是很陌生,我不敢相信我错过了。
  • 发生在我们最好的人身上:)

标签: ios xcode swift cgsize


【解决方案1】:

首先,您输入了错误的 CGFloat。是 CGFloat 而不是 CGFLoat。

对于第二部分,将 dropSize 中的 '=' 更改为 ':':

var dropSize : CGSize {
    let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
    return CGSize(width: size, height: size)
}

另外,这是我第一次在 Swift 中看到使用 '=' 而不是 ':',因为它发布...

【讨论】:

    【解决方案2】:

    这是您课程中的代码:

    var dropSize: CGSize {
        let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
        return CGSize(width: size, height: size)
    }
    

    你只需要检查你的代码和课程中的代码,它就会帮助你。

    【讨论】:

      【解决方案3】:

      在第一个错误中,您需要使用构造函数来创建您的 dropSize。我建议添加您自己的:

      static func calculateDropSize(width: CGFloat, dropsPerRow: UInt32) -> CGSize {
          let size = CGFloat(width / CGFloat(dropsPerRow))
          return CGSize(width: size, height: size)
      }
      

      然后,你会将该行重写为:

      var dropSize = MyClass.calculateDropSize(gameView.bounds.size.width, dropsPerRow: dropsPerRow)
      

      您可以将该函数添加为 CGSize 的扩展,但从面向对象的角度来看这是不可取的。

      您的第二个错误只需要强制转换:

      var frame = CGRect(origin: CGPointZero, size: CGFloat(dropSize))
      

      您的第三个错误,正如 Gasim 评论的那样,CGFloat 是错字:

      private extension CGFloat {
      

      【讨论】:

      • 我将不得不不同意你的观点,因为你为什么要将 CGSize 转换为 CGSize?他有一个演员表问题,因为他实际上有一个语法问题:他输入了= 而不是:。如果他和你一起解决这个问题,他仍然不需要转换为 CGFloat...
      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多