为什么UIColor.white,红色,绿色和蓝色不起作用,但所有其他颜色常量都正常工作?

时间:2016-12-26 20:56:49

标签: ios swift swift3 uicolor

我刚刚开始将一些Swift代码迁移到Swift 3.颜色常量的格式已从

更改
let color = UIColor.yellowColor() // Swift 2
let color = UIColor.yellow // Swift 3

我项目的大多数代码都使用这种新语法进行了很好的迁移。但是,某些UIColor颜色常量不起作用:UIColor.whiteUIColor.redUIColor.greenUIColor.blue。所有其他UIColor常量,如UIColor.yellow,都可以正常工作。故障常数显示在自动填充中,网站在线报告它们有效(http://leaks.wanari.com/2016/09/26/converting-project-swift-3-0/)。

但是,当我编译以下文件时:

import SpriteKit

let aColor = UIColor.black
let aColor2 = UIColor.darkGray
let aColor3 = UIColor.lightGray
let aColor4 = UIColor.white
let aColor5 = UIColor.gray
let aColor6 = UIColor.red
let aColor7 = UIColor.green
let aColor8 = UIColor.blue
let aColor9 = UIColor.cyan
let aColor10 = UIColor.yellow
let aColor11 = UIColor.magenta
let aColor12 = UIColor.orange
let aColor13 = UIColor.purple
let aColor14 = UIColor.brown
let aColor15 = UIColor.clear

let aFakeColor = UIColor.fakeColor

它会出现以下错误:

enter image description here

Instance member 'white' cannot be used on type 'UIColor'
Instance member 'red' cannot be used on type 'UIColor'
Instance member 'green' cannot be used on type 'UIColor'
Instance member 'blue' cannot be used on type 'UIColor'
Type 'UIColor' has no member 'fakeColor'

现在最后一个错误很有意义;没有名为fakeColor的颜色常量。但这表明编译器正在看到故障的颜色常数,因为它给出了不同的错误。

根据Apple's documentation,确实存在故障的颜色常数。为什么我的编译器不能看到它们?

1 个答案:

答案 0 :(得分:7)

更新:我发现了这个问题。

我对UIColor进行了扩展,使其更加流畅。它允许访问RGB组件,如下所示。既然UIColor具有代表红色,绿色和蓝色的redgreenblue属性,则会发生冲突。

对于遇到类似问题的其他人:请务必检查是否有任何导致此问题的扩展程序。

Swift 2 Extension

//
//  UIColor+Swifty.swift
//
//  Created by Cin316 on 3/6/16.
//  Usage is permitted under the MIT license.
//  This does not work in Swift 3.0 !
//

import SpriteKit

public extension UIColor {

    public var alpha: CGFloat? {
        get {
            var a: CGFloat = 0
            if (self.getWhite(nil, alpha: &a)) {
                return a
            } else {
                return nil
            }
        }
    }

    public var white: CGFloat? {
        get {
            var w: CGFloat = 0
            if (self.getWhite(&w, alpha: nil)) {
                return w
            } else {
                return nil
            }
        }
    }

    public var red: CGFloat? {
        get {
            var r: CGFloat = 0
            if (self.getRed(&r, green: nil, blue: nil, alpha: nil)) {
                return r
            } else {
                return nil
            }
        }
    }
    public var green: CGFloat? {
        get {
            var g: CGFloat = 0
            if (self.getRed(nil, green: &g, blue: nil, alpha: nil)) {
                return g
            } else {
                return nil
            }
        }
    }
    public var blue: CGFloat? {
        get {
            var b: CGFloat = 0
            if (self.getRed(nil, green: nil, blue: &b, alpha: nil)) {
                return b
            } else {
                return nil
            }
        }
    }

    public var hue: CGFloat? {
        get {
            var h: CGFloat = 0
            if (self.getHue(&h, saturation: nil, brightness: nil, alpha: nil)) {
                return h
            } else {
                return nil
            }
        }
    }
    public var saturation: CGFloat? {
        get {
            var s: CGFloat = 0
            if (self.getHue(nil, saturation: &s, brightness: nil, alpha: nil)) {
                return s
            } else {
                return nil
            }
        }
    }
    public var brightness: CGFloat? {
        get {
            var b: CGFloat = 0
            if (self.getHue(nil, saturation: nil, brightness: &b, alpha: nil)) {
                return b
            } else {
                return nil
            }
        }
    }

}

Swift 3 Extension

//
//  UIColor+Swifty.swift
//
//  Created by Cin316 on 3/6/16.
//  Usage is permitted under the MIT license.
//  Notice the addition of "Comp" to conflicting properties.
//

import SpriteKit

public extension UIColor {

    public var alphaComp: CGFloat? {
        get {
            var a: CGFloat = 0
            if (self.getWhite(nil, alpha: &a)) {
                return a
            } else {
                return nil
            }
        }
    }

    public var whiteComp: CGFloat? {
        get {
            var w: CGFloat = 0
            if (self.getWhite(&w, alpha: nil)) {
                return w
            } else {
                return nil
            }
        }
    }

    public var redComp: CGFloat? {
        get {
            var r: CGFloat = 0
            if (self.getRed(&r, green: nil, blue: nil, alpha: nil)) {
                return r
            } else {
                return nil
            }
        }
    }
    public var greenComp: CGFloat? {
        get {
            var g: CGFloat = 0
            if (self.getRed(nil, green: &g, blue: nil, alpha: nil)) {
                return g
            } else {
                return nil
            }
        }
    }
    public var blueComp: CGFloat? {
        get {
            var b: CGFloat = 0
            if (self.getRed(nil, green: nil, blue: &b, alpha: nil)) {
                return b
            } else {
                return nil
            }
        }
    }

    public var hue: CGFloat? {
        get {
            var h: CGFloat = 0
            if (self.getHue(&h, saturation: nil, brightness: nil, alpha: nil)) {
                return h
            } else {
                return nil
            }
        }
    }
    public var saturation: CGFloat? {
        get {
            var s: CGFloat = 0
            if (self.getHue(nil, saturation: &s, brightness: nil, alpha: nil)) {
                return s
            } else {
                return nil
            }
        }
    }
    public var brightness: CGFloat? {
        get {
            var b: CGFloat = 0
            if (self.getHue(nil, saturation: nil, brightness: &b, alpha: nil)) {
                return b
            } else {
                return nil
            }
        }
    }

}