0

배열의 길이는 NSColor이고, 배열은 CGFloat이며 그래디언트 스톱을 나타냅니다. 이 배열을 사용하여 NSGradient을 초기화하는 방법을 알 수 없습니다.배열 색상 및 부동에서 NSGradient를 만들려면 어떻게해야합니까?

나는 (NSColor, CGFloat)의 배열에 다음을 시도하지만 가변 인자를 기대하고 있기 때문에 NSGradient(colorsAndLocations:는, 그것을 가지고하지 않습니다

The code <code>let gradient = NSGradient(colorsAndLocations: colorsAndLocations)</code> yielding the error <code>Cannot convert value of type '[(NSColor, CGFloat)]' to expected argument type '(NSColor, CGFloat)'</code>

그리고 NSGradient(colors:, atLocations:, colorSpace:) 내가 어떻게 아무 생각이없는 UnsafePointer 기대를 제대로 그런 식으로라도 스위프트에서 처리하십시오.

답변

1

난 당신이 사용을 알고 있다고 가정 :

let cAndL: [(NSColor, CGFloat)] = [(NSColor.redColor(), 0.0), (NSColor.greenColor(), 1.0)] 
let gradient = NSGradient(colorsAndLocations: cAndL[0], cAndL[1]) 

불행하게도, 스위프트는 우리에게 가변 인자 함수에 배열을 줄 수있는 방법을 제공하지 않습니다.


그리고 두 번째 부분. 일부 API가 UnsafePointer<T>을 배열로 요청하면 Swift Array of T를 만들어 API에 직접 전달할 수 있습니다.

let colors = [NSColor.redColor(), NSColor.greenColor()] 
let locations: [CGFloat] = [0.0, 1.0] 
let gradient2 = NSGradient(colors: colors, atLocations: locations, colorSpace: NSColorSpace.genericRGBColorSpace()) 

당신이 (NSColor, CGFloat)의 Array을 사용하려는 경우, 당신은 같은 것을 쓸 수 있습니다 :

let gradient3 = NSGradient(colors: cAndL.map{$0.0}, atLocations: cAndL.map{$0.1}, colorSpace: NSColorSpace.genericRGBColorSpace()) 
+0

가 _ "당신은 T의 신속한 배열을 만들 수 있습니다, 그리고에 직접 전달 API "_ 안전한 것으로 보장 되었습니까? –

+1

@BenLeggiero, 분명히. [이 문서] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID23)의 상수 포인터 부분을 참조하십시오.). – OOPer