0

У меня есть массив NSColor s, а массив CGFloat s обозначает градиентные остановки. Я не могу понять, как использовать эти массивы для инициализации 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]) 

К сожалению, Swift не дает нам способ дать Массивы к переменным числом функций.


И вторая порция. Если какой-либо API утверждает UnsafePointer<T> как массив, вы можете создать Swift Array из 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()) 

Если вы хотите использовать в Array из (NSColor, CGFloat), вы можете написать что-то вроде этого:

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

_ "вы можете создать Swift массив T, и передать его непосредственно API "_ Гарантируется ли это в безопасности? –

+1

@BenLeggiero, конечно. См. Раздел «Указатели констант» [этот документ] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID23). – OOPer