虽然下面的代码以前工作过,但它已停止在 Xcode 8 Beta 4中工作,可能是因为组件返回的是一个非常非 Swift-y的C系列浮点数,并且已被删除.错误是秃头 – “’组件’不可用” – 如果有的话
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
……这是一个很好的例子 – 有没有人得到更好的答案?
这似乎是一个过渡性的beta问题.Github上的Swift repo包含一个extensive SDK overlay for CoreGraphics,包括一个新版本的CGColor.components,其返回类型是Swift数组而不是UnsafePointer.它们如何使SDK覆盖工作的部分工作是API notes,它将一些底层C调用映射到双下划线的Swift方法,以便覆盖可以将它们包装在更Swifty接口中.
看起来beta 4和beta 5编译器选择了API注释更改,但不包括包含新版本组件的覆盖.据推测,未来的测试版(或最终的Swift 3.0 / Xcode 8.0版本)将包含现在github上的所有内容.