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) 

}

如果我使用 Apple 说的方法,我不明白为什么“半径”是一个额外的参数......你知道如何解决它吗?谢谢!

4

1 回答 1

11

该错误消息非常具有误导性。真正的问题是endAngle: 参数UIBezierPath(...)具有 type CGFloat,但您正在传递一个 Double参数。显式转换值有助于:

var endAngle = CGFloat(2.0 * M_PI - M_PI_2)

为 32 位架构编译时会出现问题,其中CGFloat 定义为Float而不是Double.

另请参阅https://github.com/ksm/SwiftInFlux

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

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

——克里斯·拉特纳

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

于 2014-07-14T17:04:42.817 回答