0

我有一個NSColor s的數組,以及一個表示漸變停止的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,我不知道如何正確地在Swift中處理,如果有的話。

回答

1

我假定你知道這種用法:

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

不幸的是,雨燕並沒有爲我們提供一種方式讓陣列來可變參數的功能。


而第二部分。如果某些API聲明UnsafePointer<T>作爲數組,則可以創建一個T的Swift數組,並將其直接傳遞給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,你可以寫這樣的事情:

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

相關問題