Swift - UIBezierPath在调用时出现额外的参数'radius'

3

我正在将一个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' 是一个额外的参数。 你知道如何解决吗?谢谢!


在我的游乐场里似乎运行良好。 - David Berry
1个回答

11
错误信息非常误导人,真正的问题是UIBezierPath(...)中的endAngle:参数具有CGFloat类型,但您正在传递一个Double参数。显式转换值可以帮助解决问题:
var endAngle = CGFloat(2.0 * M_PI - M_PI_2)

问题出现在编译32位架构时,CGFloat被定义为Float而不是Double。详见https://github.com/ksm/SwiftInFlux

这里发生的情况是,CGFloat是一个类型别名,根据你是编译32位还是64位,它的底层类型是Float或者Double。这恰好是Objective-C的工作方式,但在Swift中具有问题,因为Swift不允许隐式转换。

我们已经意识到了这个问题并认为它非常严重:我们正在评估几种不同的解决方案,并将在以后的测试版中推出其中一种。正如您所注意到的,您今天可以通过强制转换为Double来解决这个问题。这是不优雅但有效的方法 :-)。

-- Chris Lattner

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


太好了!Chris Lattner 的一些见解。错过了他的帖子,我真的很感激你的引用! - Klaas
1
@FrankSchmitt:我已经使用Xcode 6.1.1再次验证过了,而且在我的建议更改下,代码确实可以编译。 - Martin R
@MartinR 你说得对。我在给一个CGPath类型的变量赋值,导致出现了一个相同的错误。添加一个尾随的.CGPath解决了这个问题。 - Frank Schmitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接