Невозможно вызвать значение не-функционального типа "CIImage?"

Этот код отлично компилируется

let ciImage = CIImage(image:UIImage())

однако, когда я перемещаю его в расширение UIImage

extension UIImage {
    func foo() {
        let ciImage = CIImage(image:UIImage()) // compile error
    }
}

Я получаю следующую ошибку компиляции

Cannot call value of non-function type 'CIImage?'

Почему?


Протестировано игровой площадкой Xcode 7.1.1. и Swift 2.1

Ответ 1

Это потому, что, как только внутри UIImage, термин CIImage рассматривается как свойство CIImage UIImage, из-за неявного self в качестве получателя сообщения - другими словами, Swift превращает ваш CIImage в self.CIImage и все это спустится оттуда.

Вы можете решить эту проблему, устранив использование Swift использованием пространства имен:

extension UIImage {
    func foo() {
        let ciImage = UIKit.CIImage(image:UIImage())
    }
}

EDIT В Swift 3 эта проблема исчезнет, ​​потому что все свойства начинаются с маленьких букв. Свойство будет называться CIImage, и не будет путаницы с классом CIImage.