在Swift中子类化CIFilter

Ash*_*lls 5 ios cifilter swift

我正在尝试创建CIFilter如下的子类:

class ColorMonochromeFilter: CIFilter {

    required init(red: CGFloat!, green: CGFloat!, blue: CGFloat!) {

        super.init(name: "ColorMonochrome")
        setDefaults()

        let colour = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
        setValue(colour, forKey: kCIInputColorKey)
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

  1. “ ColorMonochromeFilter”类未实现其超类的必需成员
  2. 必须调用超类'CIFilter'的指定初始化程序

似乎指定的初始化程序是init(coder aDecoder: NSCoder!)由于CIFilter符合NSCoding协议,而不是init(name: String!)在的扩展名中声明的CIFilter

我可以通过添加以下内容来消除第一个错误:

    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }
Run Code Online (Sandbox Code Playgroud)

(尽管这似乎有些多余!)

有没有办法解决第二个问题?


我想在这里实现的是Swift的等效功能:

@implementation ASHColorMonochromeFilter

    + (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue
    {
        ASHColorMonochromeFilter * filter = (ASHColorMonochromeFilter *)[ASHColorMonochromeFilter filterWithName: @"CIColorMonochrome"];

        UIColor * color = [UIColor colorWithRed: red green: green blue: blue alpha: 1.0];
        [filter setValue: color forKey: kCIImageColorSpace];

        return filter;
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 4

你的 Objective-C 类方法

+ (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue
Run Code Online (Sandbox Code Playgroud)

实际上返回 的(子类)的实例CIFilter。在 Swift 中可以通过方便的初始化器实现同样的效果

extension CIFilter {
     convenience init(red: CGFloat, green: CGFloat, blue: CGFloat) {
        self.init(name:"CIColorMonochrome")
        setDefaults()
        let colour = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
        setValue(colour, forKey: kCIInputColorKey)
    }
}
Run Code Online (Sandbox Code Playgroud)

这被称为

let filter = CIFilter(red: 0.1, green: 0.2, blue: 0.3)
Run Code Online (Sandbox Code Playgroud)