2016-08-04 32 views
2

雖然以前的代碼工作,它已停止工作在Xcode 8 Beta 4,可能是因爲components返回是一個非Swift-y C浮點數組,並已除去。該錯誤是禿頂 - 「'組件'不可用」 - 我找不到替代它,如果有的話。有誰知道如何產生相同的功能?Xcode 8 Beta 4 CGColor.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])! 
    } 
} 

更新 @哈米什的答案的作品,但我的初衷是不使用的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 

...這是這樣一個雜牌 - 有沒有人有一個更好的答案?

+1

只需使用SKColor –

+0

https://developer.apple.com/reference/spritekit/skcolor –

+0

絕妙的主意 - 但實際上CIColor是一個更好的調用,如SKColor具有CGColor沒有直接初始化,並CIColor具有並且具有'.red','.green','。blue'和'.alpha'屬性。你想做出答案嗎? – Grimxn

回答

1

我也有點困惑,爲什麼他們已經從CGColor刪除components財產,因爲似乎沒有任何一種明顯的替代方法/財產。 看起來他們試圖讓人們使用更高層次的UIColorNSColor類。 (作爲@rickster has discovered,這看起來更像是一個簡單的過渡問題)。

一個解決方案,因爲你正在使用的RGB顏色,是簡單地包裹你的CGColorUIColor/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以防止此解決方案需要進行不必要的包裝。

+0

嗯。我使用CGColor(的確是Core Graphics通常)的原因是讓平臺不可知的代碼... – Grimxn

+0

...仍然,你的答案有訣竅! – Grimxn

+0

@Grimxn啊好吧......我不確定我能爲您提供一個平臺不可知的解決方案 - 因爲這種改變看起來並不好(如果有的話)。我會在這裏留下我的答案,以防其他人有用,並希望別人提出一個更好的主意:) – Hamish

2

@哈米什的答覆工作,但我的初衷是使用UIColorNSColor讓我的代碼工作中不論是iOS & MacOS的。 @LeoDabus提示使用SKColor,但是這只是一個類型別名要麼NSColorUIColor,並沒有從CGColor直接初始化,無論如何,然而,獅子座的建議促使我來細化使用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) 
    } 
} 
+0

這絕對看起來像最好的解決方案(+1) - 儘管IMO仍然覺得有點不滿意,爲了訪問顏色組件,必須在另一個實例中封裝CGColor。我希望蘋果正在開發一個更好的界面來直接從CGColor中獲取顏色組件,但我想我們必須等待,看看Xcode 8 beta 5帶來了什麼(如果有的話)。 – Hamish

+0

同意。我不會接受我自己的答案! – Grimxn

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

它的工作原理如我所料,但我不知道這是你期望的,或者蘋果將其視爲使用私有API。 (Apple's latest documentation of CGColor不包含雙下劃線含鉛符號。)

+0

它看起來像它! – Grimxn

4

這看起來像是一個過渡測試版問題。

Github上的Swift repo包括一個extensive SDK overlay for CoreGraphics,其中包括CGColor.components的新版本,它的返回類型是Swift數組而不是UnsafePointer。他們如何使SDK覆蓋工作的一部分是API notes,它將一些底層C調用映射到雙下劃線的Swift方法,以便覆蓋可以將它們包裝在更多Swifty接口中。

它看起來像測試版4和測試版5編譯器拿起API註釋更改,但不包括包含新版本components的覆蓋。據推測未來的測試版(或最終的Swift 3.0/Xcode 8.0版本)將包括現在在github上的所有內容。

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

    } 
} 
相關問題