Swift - UIBezierPath额外参数' radius'在电话中

时间:2014-07-14 16:56:42

标签: swift uibezierpath layoutsubviews

我正在将一个Objective-C库(STKSpinnerView)改编为Swift,我无法解决这个错误:

func getRadius() -> CGFloat {
    var r : CGRect = CGRectInset(self.bounds, self.wellThickness/2.0, self.wellThickness/2.0)
    var w : CGFloat = r.size.width
    var h : CGFloat = r.size.height

    if w > h {
        return h/2.0
    }else{
        return w/2.0
    }
}

override func layoutSubviews()  {
    super.layoutSubviews()

    var bounds : CGRect = self.bounds
    var wt : CGFloat = self.wellThickness
    var outer : CGRect = CGRectInset(self.bounds, wt/2.0, wt/2.0)
    var inner : CGRect = CGRectInset(self.bounds, wt, wt)

    var innerPath : UIBezierPath = UIBezierPath(ovalInRect: inner)
    var arcCenter = CGPointMake(CGRectGetMidX(outer), CGRectGetMidY(outer))
    var radius = self.getRadius()
    var startAngle = -(CGFloat(M_PI_2))
    var endAngle = (2.0 * M_PI - M_PI_2)
    // (Next line) ERROR: Extra argument 'radius' in call
    var outerPath : UIBezierPath = UIBezierPath(arcCenter: arcCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) 

}

我不明白为什么' radius'如果我使用像Apple这样的方法,那么这是一个额外的争论...... 你知道怎么解决吗? 谢谢!

1 个答案:

答案 0 :(得分:11)

错误消息非常具有误导性。真正的问题是endAngle: UIBezierPath(...)的参数类型为CGFloat,但您传递的是{。}} Double论点。明确地转换值有助于:

var endAngle = CGFloat(2.0 * M_PI - M_PI_2)

编译32位体系结构时出现问题,其中CGFloat 定义为Float,而不是Double

另见https://github.com/ksm/SwiftInFlux

  

这里发生的是CGFloat是Float的一个类型   或Double,取决于您是构建32位还是64位。这个   正是Objective-C的工作方式,但在Swift中存在问题,因为   Swift不允许隐式转换。

     

我们意识到这个问题并认为它是严肃的:我们是   现在评估几种不同的解决方案,并将推出一个   在后来的测试中。正如您所注意到的,您今天可以应对此问题   铸造成Double。这是不优雅但有效的: - )

     

- Chris Lattner

     

资料来源:https://devforums.apple.com/message/998222#998222