Невозможно создать NSBitmapImageRep в Swift

У меня есть проект osx xcode, созданный с помощью xcode 6.1. Я хотел использовать его для обучения с использованием SWIFT.

В одном из своих представлений я попытался создать NSBitMapImageRep, как показано здесь:

class BitmapView : NSView {
var image: NSBitmapImageRep!

override func awakeFromNib() {
    var blub = NSBitmapImageRep(bitmapDataPlanes: nil,
        pixelsWide: Int(self.frame.size.width),
        pixelsHigh: Int(self.frame.size.height),
        bitsPerSample: 8,
        samplesPerPixel: 1,
        hasAlpha: false,
        isPlanar: false,
        colorSpaceName: NSCalibratedRGBColorSpace,
        bytesPerRow: 0, bitsPerPixel: 0)!

    //test()
}}

Но каждый раз, когда я пытаюсь запустить его, я получаю следующую ошибку:

Inconsistent set of values to create NSBitmapImageRep fatal error: unexpectedly found nil while unwrapping an Optional value

Я думаю, это связано с тем, что bitmapDataPlanes равен нулю. Но это необязательное значение, и, согласно документации, оно может быть NULL. Однако передача NSNull() не компилируется.

Может ли кто-нибудь сказать мне, что я должен был бы пройти вместо этого? о_О


person Infinite    schedule 17.11.2014    source источник


Ответы (1)


Ошибка на самом деле довольно описательная - вы предоставляете несогласованный набор значений для инициализатора. В частности, значение samplesPerPixel, равное 1, не может поддерживать цветовое пространство RGB, указанное в colorSpaceName. Отсюда:

samplesPerPixel: количество компонентов данных или выборок на пиксель. Это значение включает как компоненты цвета, так и компонент покрытия (альфа), если он присутствует. Значимые значения находятся в диапазоне от 1 до 5. Изображение с голубым, пурпурным, желтым и черным цветовыми компонентами (CMYK) плюс компонент покрытия будет иметь spp, равное 5; изображение в градациях серого, в котором отсутствует компонент покрытия, будет иметь spp, равное 1.

Так что вам просто нужно изменить выборки на пиксель на 3:

var blub = NSBitmapImageRep(bitmapDataPlanes: nil,
    pixelsWide: Int(100),
    pixelsHigh: Int(100),
    bitsPerSample: 8,
    samplesPerPixel: 3,
    hasAlpha: false,
    isPlanar: false,
    colorSpaceName: NSCalibratedRGBColorSpace,
    bytesPerRow: 0, bitsPerPixel: 0)!
person Nate Cook    schedule 17.11.2014
comment
Принимая во внимание, что ваш ответ правильный, я не нахожу ошибку очень описательной... подробная ошибка описывает неожиданно найденный nil при развертывании необязательного значения, из-за чего кажется, что ошибка находится где-то совсем в другом месте... в основном в bitmapDataPlanes.. . - person Infinite; 18.11.2014
comment
Вы выполняете принудительную распаковку (!) отказавшего инициализатора (init?). На самом деле это очень распространенная ошибка, которую можно увидеть в этом случае. - person Ssswift; 08.02.2017