在 Swift 项目中找不到接受“(() -> _)”类型参数列表的类型 'CGSize' 的初始值设定项
Cannot find an initializer for type 'CGSize' that accepts an argument list of type '(() -> _)' in Swift Project
我正在学习斯坦福大学的课程并收到此错误:
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.
对于第二部分,将 dropSize 中的 '=' 更改为 ':':
var dropSize : CGSize {
let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
return CGSize(width: size, height: size)
}
此外,这是我第一次看到在 Swift 中使用“=”代替“:”,因为它发布了...
这是您课程中的代码:
var dropSize: CGSize {
let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
return CGSize(width: size, height: size)
}
你只需要检查你的代码和课程中的代码,它对你有帮助。
在第一个错误中,您需要使用构造函数来创建您的 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 {
我正在学习斯坦福大学的课程并收到此错误:
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.
对于第二部分,将 dropSize 中的 '=' 更改为 ':':
var dropSize : CGSize {
let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
return CGSize(width: size, height: size)
}
此外,这是我第一次看到在 Swift 中使用“=”代替“:”,因为它发布了...
这是您课程中的代码:
var dropSize: CGSize {
let size = gameView.bounds.size.width / CGFloat(dropsPerRow)
return CGSize(width: size, height: size)
}
你只需要检查你的代码和课程中的代码,它对你有帮助。
在第一个错误中,您需要使用构造函数来创建您的 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 {