虽然下面的代码以前工作过,但它已停止在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 - 有没有人得到更好的答案?
答案 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的答案有效,但我的原意是不使用UIColor
或NSColor
,以便我的代码可以在iOS和&苹果系统。 @LeoDabus建议使用SKColor
,但这只是NSColor
或UIColor
的类型别名,并且无论如何都没有来自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
属性,因为似乎没有任何明显的替换方法/属性。 看起来他们试图让人们使用更高级别的(作为@rickster has discovered,这看起来更像是一个简单的过渡性问题)。UIColor
或NSColor
类。
当您使用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)
}
}