2016-08-04 3 views
2

Несмотря на то, что предыдущий код работал ранее, он прекратил работать в Xcode 8 Beta 4, предположительно потому, что возврат components был очень неуправляемым 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])! 
    } 
} 

Update @ ответов работ Хэмиш, но мое первоначальное намерение было не использовать UIColor ни NSColor так, что мой код работает в обоих прошивкой & 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 не имеет прямого Init от CGColor и CIColor имеет, а также имеет свойства '.red',' .green', '.blue' и' .alpha'. Вы хотите ответить на этот вопрос? – Grimxn

ответ

1

Я также немного озадачен тем, почему они удалили свойство components от CGColor, так как, похоже, не существует какого-либо очевидного метода/свойства замены. Похоже, они пытаются заставить людей использовать более высокий уровень UIColor или NSColor классов. (Как @rickster has discovered, это больше похоже на простую переходную проблему).

Одно решение, как вы работаете с 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, чтобы предотвратить ненужную упаковку, требуемую этим решением.

+0

Хм. Причина, по которой я использую CGColor (на самом деле Core Graphics вообще), - это иметь агностический код платформы ... – Grimxn

+0

... все-таки ваш ответ делает трюк! – Grimxn

+0

@Grimxn Ах, ладно ... Я не уверен, что могу предложить вам агностическое решение платформы - так как это изменение не выглядит хорошо (если вообще!) Задокументировано. Я оставлю свой ответ здесь, если он будет полезен кому-либо еще и надеюсь, что кто-то еще придумает лучшую идею :) – Hamish

2

@ ответ Хэмиша работает, но мой первоначальный замысел был не использовать UIColor или NSColor так, что мой код работает в оба прошивке & MacOS. @LeoDabus предложил использовать SKColor, но это только псевдоним типа либо NSColor или UIColor, и не имеет прямую инициализацию от 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» в другом экземпляре просто получить доступ к цветным компонентам. Я надеюсь, что Apple будет работать над лучшим интерфейсом, чтобы напрямую получать компоненты цвета из «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] 
     } 
    } 
} 

Он работает, как я ожидал, но я не уверен, что это, как вы ожидаете, или Apple, будет рассматривать это как использование частного API. (Apple's latest documentation of CGColor не содержит символа с двойным подчеркиванием.)

+0

Это скорее похоже! – Grimxn

4

Это похоже на переходную бета-версию.

Свифт репо на Github включает в себя 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) 

    } 
} 
Смежные вопросы