从Swift 2迁移到Swift 3后,这一特定行失败了:
let brightness = ((((components?[0])! * 299.0) as CGFloat) + (((components?[1])! * 587.0) as CGFloat) + (((components?[2])! * 114.0)) as CGFloat) / (1000.0 as CGFloat)
寻求帮助将其转换为Swift 3.我尝试使用此转换器,但它没有做到正确:https://objectivec2swift.com/#/home/converter/
这是我的原始代码:
extension UIColor {
func isLight() -> Bool {
let components = self.cgColor.components
let brightness = ((((components?[0])! * 299.0) as CGFloat) + (((components?[1])! * 587.0) as CGFloat) + (((components?[2])! * 114.0)) as CGFloat) / (1000.0 as CGFloat)
if brightness < 0.5 {
return false
}
else {
return true
}
}
}
答案 0 :(得分:2)
在任何版本的Swift下,该行都应该因为如此笨拙而失败。
首先,安全打开可选项。并且最后只使用一个演员。
func isLight() -> Bool {
if let components = self.cgColor.components {
let brightness = CGFloat((components[0] * 299 + components[1] * 587 + components[2] * 114) / 1000)
return brightness > 0.5
} else {
return false
}
}
此代码假设颜色位于RGB颜色空间中。否则此代码将失败(就像原始代码失败一样)。
这是一个更安全的实现,可以处理RGB和灰度颜色:
func isLight() -> Bool {
var brightness: CGFloat = 0
var r: CGFloat = 0
var g: CGFloat = 0
var b: CGFloat = 0
if self.getRed(&r, green: &g, blue: &b, alpha: nil) {
brightness = (r * 299 + g * 587 + b * 114) / 1000
} else {
var w: CGFloat = 0
if self.getWhite(&w, alpha: nil) {
brightness = w
}
}
return brightness > 0.5
}