Xcode 8 Beta 4 CGColor.components 不可用

Xcode 8 Beta 4 CGColor.components unavailable

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

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 和 MacOS 中运行。我最后做的是这个...

#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

...这是这样的 一个拼凑 - 有没有人有更好的答案?

我也有点困惑为什么他们从 CGColor 中删除了 components 属性,因为似乎没有任何明显的替代品 method/property。 看起来他们正试图让人们使用更高级别的 UIColorNSColor 类。(如 ,这看起来更像是一个简单的过渡问题)。

当您使用 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 类型,以防止此解决方案所需的不必要的包装。

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

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

我可能弄错了什么,但你可以在 CGColor 的导入 header 中找到它。

/* 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 不包含 double-underscore 个前导符号。)

这看起来像是一个过渡性测试版问题。

Github 上的 Swift 存储库包含一个 extensive SDK overlay for CoreGraphics, including a new version of CGColor.components whose return type is a Swift array instead of an UnsafePointer. Part of how they make that SDK overlay work is API notes,它将一些底层 C 调用映射到双下划线的 Swift 方法,以便覆盖可以将它们包装在 more-Swifty 界面中。

看起来 beta 4 和 beta 5 编译器接受了 API 注释更改,但没有包含新版本 components 的覆盖。据推测,未来的测试版(或最终的 Swift 3.0 / Xcode 8.0 版本)将包括现在 github.

上的所有内容
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)

    }
}