无法将此Swift 2代码转换为Swift 3

时间:2017-09-14 17:36:59

标签: ios swift

从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
        }
    }
}

1 个答案:

答案 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
}