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。 看起来他们正试图让人们使用更高级别的 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
类型,以防止此解决方案所需的不必要的包装。
@Hamish 的回答有效,但我的初衷是 而不是 使用 UIColor
或 NSColor
以便我的代码在 iOS & 苹果系统。 @LeoDabus 建议使用 SKColor
,但这只是 NSColor
或 UIColor
的类型别名,并且无论如何都没有来自 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)
}
}
虽然下面的代码以前可以工作,但它在 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。 看起来他们正试图让人们使用更高级别的 (如 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
类型,以防止此解决方案所需的不必要的包装。
@Hamish 的回答有效,但我的初衷是 而不是 使用 UIColor
或 NSColor
以便我的代码在 iOS & 苹果系统。 @LeoDabus 建议使用 SKColor
,但这只是 NSColor
或 UIColor
的类型别名,并且无论如何都没有来自 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)
}
}