Swift-UIBezierPath额外参数';半径';随时待命
我正在将Objective-C库()改编为Swift,但无法解决此错误:Swift-UIBezierPath额外参数';半径';随时待命,swift,uibezierpath,layoutsubviews,Swift,Uibezierpath,Layoutsubviews,我正在将Objective-C库()改编为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 >
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)
}
我不明白为什么“半径”是一个额外的参数,如果我使用像苹果说的方法。。。
你知道怎么解决吗?
谢谢 错误消息非常容易引起误解。真正的问题是
endAngle:
UIBezierPath(…)
的参数的类型为CGFloat
,但您正在传递
Double
参数。显式转换值有助于:
var endAngle = CGFloat(2.0 * M_PI - M_PI_2)
编译32位体系结构时会出现问题,其中CGFloat
定义为Float
,而不是Double
另见:
这里发生的是CGFloat是这两个Float的类型别名
或者加倍,这取决于您是构建32位还是64位。这
这正是Objective-C的工作原理,但在Swift中存在问题,因为
Swift不允许隐式转换
我们意识到这个问题并认为它是严肃的:我们是
正在评估几种不同的解决方案,并将推出一种
在稍后的测试版中。正如你所注意到的,你今天可以通过
铸造双。这是不雅但有效的:-)
--克里斯·拉特纳
资料来源:
在操场上对我来说似乎很好。太好了!克里斯·拉特纳的一些见解。错过了他的帖子,我真的很感谢你的报价@弗兰克施密特:我已经用Xcode 6.1.1再次验证了它,并且用我建议的更改代码确实可以编译。@MartinR你说得对。我分配给CGPath类型的变量,这导致了一个相同的错误。添加尾部的
.CGPath
修复了它。