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

残念ながら、スウィフトは、私たちに可変長引数の関数に配列を与えるための方法を提供していません。


そして第2部分。いくつかの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()) 

あなたは(NSColorCGFloat)のArrayを利用したい場合、あなたはこのような何か書くことができます:あなたはTのスウィフト配列を作成し、直接渡すことができ、「_

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

をAPI "_これは安全であることが保証されていますか? –

+1

@BenLeggiero、確かに。 [このドキュメント](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID23)の定数ポインタの部分を参照してください。 )。 – OOPer

関連する問題