'CIImage - необъявленный тип' странная ошибка

Пожалуйста, помогите понять, что здесь не так. Я пробовал как Xcode 6.0.1, так и Xcode 6.1 beta 2. У меня есть простое расширение.

extension UIImage {
    func saturate (toLevel level : Float) -> UIImage {
        // create filter
        let saturationFilter = CIFilter(name: "CIColorControls")
        saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey)
        saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation")

        // create context
        let context = CIContext(options: nil)

        // render image with filter
ERROR:  let renderedImage = saturationFilter.valueForKey(kCIOutputImageKey) as CIImage
        let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent())

        return UIImage(CGImage: imageRef)
    }
}

Но компилятор говорит "Использование необъявленного типа" CIImage ". Какого черта? Я попытался импортировать CoreImage, но ничего не изменилось

Ответы

Ответ 1

Используйте CoreImage.CIImage вместо CIImage для устранения неоднозначности.

Ответ 2

Чтобы избежать ошибки, вы можете определить псевдоним типа.

typealias MYImage = CIImage

Затем объявите ввод CIImage в своей категории как:

let inputImage = MYImage(image: self)

Ответ 3

Кажется, это ошибка в Xcode, typecasting Fails только внутри блока расширения. Вы можете напрямую обращаться к выходному изображению, используя свойство outputImage, которое имеет тип CIImage. Не нужно использовать valueForKey, Попробуйте под кодом

 extension UIImage {
        func saturate (toLevel level : Float) -> UIImage {
            // create filter
            let saturationFilter = CIFilter(name: "CIColorControls")
            saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey)
            saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation")

            // create context
            let context = CIContext(options: nil)

            // render image with filter
        let renderedImage = saturationFilter.outputImage
         let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent())

            return UIImage(CGImage: imageRef)
        }
    }

************************ Обновить ************ ***********

Я думаю, что в вашем случае ciImage свойство экземпляра UIImage имеет значение nil, поэтому его сбой. Заметим, что UIImage на самом деле не a ciImage. Другими словами, UIImage ciImage не равен нулю, только если UIImage уже поддерживается ciImage (например, потому что он был сгенерирован с помощью imageWithCIImage:). Вы не можете использовать это, чтобы волшебным образом превратить UIImage в ciImage, как вы, кажется, надеетесь сделать.

Итак, вам нужно инициализировать изображение с помощью экземпляра CIImage, попробуйте сделать это, чтобы избавиться от сбоя

    let image = UIImage(named: "test")

    let ciImage = CIImage(image: image)

    let imageWithCIImage = UIImage(CIImage: ciImage)

    imageWithCIImage.saturate(toLevel: 0.5)