Swift 3 GCFloat到GCRect

问题描述:

我在Swift项目中使用了这段代码。 下面的代码工作得很好斯威夫特2,但似乎并没有在斯威夫特3不再工作,它提供了以下错误:Swift 3 GCFloat到GCRect

无法指定类型的值“(CGFloat的,CGFloat的,INT,INT)”到类型'的CGRect'

if plusLayer == nil { 
     plusLayer = CALayer() 
     let halfWidth: CGFloat = self.bounds.size.width/2 
     let halfHeight: CGFloat = self.bounds.size.height/2 
     let ds: CGFloat = sqrt(halfWidth * halfWidth/2) 
     let x: CGFloat = halfWidth + ds - 27/2 
     let y: CGFloat = halfHeight - ds - 27/2 
     plusLayer.frame = (x, y, 27, 27) 
     plusLayer.contentsGravity = kCAGravityResizeAspectFill 
     if let i = plusSignImage { 
      plusLayer.contents = i.cgImage 
     } else { 
      plusSignImage = UIImage(named: "PlusSign", in: Bundle(for: self.dynamicType), compatibleWith: UITraitCollection(displayScale: UIScreen.main().scale)) 
      plusLayer.contents = plusSignImage!.cgImage 
     } 
     layer.addSublayer(plusLayer) 
    } 

任何人都知道如何解决这个问题呢?帮助,真的很感激!

谢谢! :d

+0

plusLayer.frame = CGRectMake(x,y,CGFloat(27),CGFloat(27))是否有效? –

+0

您确定此代码可以与Swift 2一起使用吗?我无法得到它编译 - 你不能分配一个元组到一个结构。使用初始化CGRect(x:x,y:y,宽度:27,高度:27)' – Hamish

此行plusLayer.frame = (x, y, 27, 27)

应该是 plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)

这是因为CGRect初始化期望4个数字用相同类型的。看看Xcode的建议: enter image description here

+0

这给出了这个错误:无法指定 '(CGFloat,CGFloat,(CGFloat),(CGFloat)) '(又名'(CGFloat,CGFloat,CGFloat,CGFloat)')键入'CGRect' –

+0

@MatthijsOtterloo我修改了我的答案以提供正确的解决方案和解释。 – BalestraPatrick

你需要的27(一Int类型)显式转换到CGFloat

plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat) 

作为一个老开发人员,让我们做一些清晰:

一)铸造是一些语言的强大功能,但必须详细了解

b)我们可以使用“as”进行投射,但与CGFloat(xx)

c)“as”必须用于对象的类型转换。 (参见: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html ) d)CGRectMake做工作迅速2.X/7.3的Xcode

五)不投翻一番,只需使用:

let r = CGRect(x: 10, y: 20, width: 30, height: 40) 

编译器会明白其中的这些方法请拨打:

public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) 
public init(x: Double, y: Double, width: Double, height: Double) 
public init(x: Int, y: Int, width: Int, height: Int) 

并且会叫第3个。

,如果你写:

let d = 10.0 
    let r2 = CGRect(x: d, y: 20, width: 30, height: 40) 

它会调用2,如d是一个双。

我的两毛钱。