我正在将一个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这样的方法,那么这是一个额外的争论...... 你知道怎么解决吗? 谢谢!
答案 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