Swift 3 GCFloat 到 GCRect
Swift 3 GCFloat to GCRect
我在我的 Swift 项目中使用了这段代码。
以下代码在 Swift 2 中运行良好,但在 Swift 3 中似乎不再运行,它给出了以下错误:
无法将类型“(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
这一行plusLayer.frame = (x, y, 27, 27)
应该是
plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
这是因为 CGRect
初始化程序需要 4 个相同类型的数字。看看 Xcode 的建议:
您需要将 27(Int
类型)显式转换为 CGFloat
:
plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
作为一个老开发者,先说明一下:
a) casting是一些语言的强大特性,但必须详细了解
b) 我们可以使用 "as" 进行转换,但与使用 CGFloat(xx)
不同
c) "as" 必须用于对象的类型转换。
(看:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html
)
d) CGRectMake 在 swift 2.x/xcode 7.3
中工作
e) 不要加倍,只需使用:
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)
它将调用 2nd,因为 d 是 Double。
我的两分钱。
我在我的 Swift 项目中使用了这段代码。 以下代码在 Swift 2 中运行良好,但在 Swift 3 中似乎不再运行,它给出了以下错误:
无法将类型“(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
这一行plusLayer.frame = (x, y, 27, 27)
应该是
plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
这是因为 CGRect
初始化程序需要 4 个相同类型的数字。看看 Xcode 的建议:
您需要将 27(Int
类型)显式转换为 CGFloat
:
plusLayer.frame = (x, y, 27 as CGFloat, 27 as CGFloat)
作为一个老开发者,先说明一下:
a) casting是一些语言的强大特性,但必须详细了解
b) 我们可以使用 "as" 进行转换,但与使用 CGFloat(xx)
不同c) "as" 必须用于对象的类型转换。 (看: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html ) d) CGRectMake 在 swift 2.x/xcode 7.3
中工作e) 不要加倍,只需使用:
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)
它将调用 2nd,因为 d 是 Double。
我的两分钱。