Xcode 8 Beta 4 CGColor.components不可用

时间:2016-08-04 13:52:56

标签: core-graphics swift3

虽然下面的代码以前工作过,但它已停止在Xcode 8 Beta 4中工作,大概是因为components返回是一个非常非Swift-y C-array的浮点数,并且已被删除。错误是秃头 - “'组件'不可用” - 如果有的话,我找不到取代它的东西。有谁知道如何产生相同的功能?

public var cgColour: CGColor {
    get {
        return CGColor(red: self.colourRed, green: self.colourGreen, blue: self.colourBlue, alpha: self.colourAlpha)
    }
    set {
        let comps = newValue.components // No longer available
        self.colourRed = (comps?[0])!
        self.colourGreen = (comps?[1])!
        self.colourBlue = (comps?[2])!
        self.colourAlpha = (comps?[3])!
    }
}

更新 @Hamish的答案有效,但我最初的意图是不使用UIColor或NSColor,以便我的代码可以在iOS和&苹果系统。我最终做的就是这个......

#if os(iOS)
import UIKit
#elseif os(OSX)
import Cocoa
#endif

extension CGColor {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0
        #if os(iOS)
            UIColor(cgColor: self).getRed(&r, green: &g, blue: &b, alpha: &a)
        #elseif os(OSX)
            NSColor(cgColor: self)?.getRed(&r, green: &g, blue: &b, alpha: &a)
        #endif
        return (r, g, b, a)
    }
}
// Playground code to test...
#if os(iOS)
let rgba = UIColor.brown.cgColor.components //(0.6, 0.4, 0.2, 1.0)
#elseif os(OSX)
let rgba = NSColor.brown.cgColor.components //(0.6, 0.4, 0.2, 1.0)
#endif

...这是这样的 kludge - 有没有人得到更好的答案?

5 个答案:

答案 0 :(得分:4)

这看起来像是一个过渡性的beta问题。

Github上的Swift repo包含一个extensive SDK overlay for CoreGraphics,包括CGColor.components的新版本,其返回类型是Swift数组而不是UnsafePointer。它们如何使SDK覆盖工作的部分工作是API notes,它将一些底层C调用映射到双下划线的Swift方法,以便覆盖可以将它们包装在更Swifty的接口中。

看起来beta 4和beta 5编译器选择了API注释更改,而不是包含新版本components的覆盖。据推测,未来的测试版(或最终的Swift 3.0 / Xcode 8.0版本)将包含现在github上的所有内容。

答案 1 :(得分:3)

@Hamish的答案有效,但我的原意是使用UIColorNSColor,以便我的代码可以在iOS和&苹果系统。 @LeoDabus建议使用SKColor,但这只是NSColorUIColor的类型别名,并且无论如何都没有来自CGColor的直接初始化,但是,Leo的建议提示我使用 CIColor 改进我的kludge:

import CoreImage

extension CGColor {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        let ciColor = CIColor(cgColor: self)
        return (ciColor.red, ciColor.green, ciColor.blue, ciColor.alpha)
    }
}

答案 2 :(得分:2)

我也有点为什么从components删除了CGColor属性,因为似乎没有任何明显的替换方法/属性。 看起来他们试图让人们使用更高级别的UIColorNSColor类。(作为@rickster has discovered,这看起来更像是一个简单的过渡性问题)。

当您使用RGB颜色时,一个解决方案是将CGColor简单地包裹在UIColor / NSColor中,然后使用getRed(_:green:blue:alpha:)方法取而代之的是组件。

public var cgColour : CGColor {
    get {
        return CGColor(red: colourRed, green: colourGreen, blue: colourBlue, alpha: colourAlpha)
    }
    set {
        NSColor(cgColor: newValue)?.getRed(&colourRed, green: &colourGreen, blue: &colourBlue, alpha: &colourAlpha)
    }
}

也许不是最理想的解决方案 - 肯定会有兴趣知道其他人是否有更好的解决方案,或者更了解这一变化。根据此属性的用法,您可能还需要考虑将其设置为UIColor / NSColor类型,以防止此解决方案所需的不必要的包装。

答案 3 :(得分:1)

我可能会误解某些内容,但您可以在导入的CGColor标题中找到它。

/* Return the color components (including alpha) associated with `color'. */

@available(OSX 10.3, *)
public var __unsafeComponents: UnsafePointer<CGFloat>? { get }

这不是你要找的吗?

我可以这样写:

public var cgColour: CGColor {
    get {
        return CGColor(red: self.colourRed, green: self.colourGreen, blue: self.colourBlue, alpha: self.colourAlpha)
    }
    set {
        if let comps = newValue.__unsafeComponents, newValue.numberOfComponents == 4 {
            self.colourRed = comps[0]
            self.colourGreen = comps[1]
            self.colourBlue = comps[2]
            self.colourAlpha = comps[3]
        }
    }
}

它按照我的预期工作,但我不确定它是否符合您的预期,或Apple会将其视为使用私有API。 (Apple's latest documentation of CGColor不包含双下划线引线符号。)

答案 4 :(得分:-3)

extension UIColor {
    var all4Components:(red:CGFloat, green:CGFloat, blue: CGFloat, alpha:CGFloat) {
    let components = self.cgColor.components!
    let red = components[0]
    let green = components[1]
    let blue = components[2]
    let alpha = components[3]
    return (red:red, green:green, blue: blue, alpha:alpha)

    }
}