用Swift子类化CIFilter

5

我想创建一个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)
    }
}

我收到了以下错误信息:
  1. 类“ColorMonochromeFilter”未实现其超类所需的成员
  2. 必须调用超类“CIFilter”的指定初始化程序
看起来指定的初始化程序是 init(coder aDecoder: NSCoder!),因为 CIFilter 符合 NSCoding 协议,而不是在 CIFilter 的扩展中声明的 init(name: String!)
我可以通过添加以下内容来消除第一个错误:
    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

虽然这似乎有点多余!

有没有解决第二个问题的方法?


我在这里尝试实现以下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;
    }

你真的想要子类化 CIFilter 来添加/重写方法,还是只需要一个额外的初始化器? - Martin R
好的,在这种情况下,我想了解如何实现上述目标,如果可能的话 - 或者是否存在我的知识盲区。 - Ashley Mills
我并不是这个领域的专家,但据我所知,init(name: "ColorMonochrome")会加载一个预定义的过滤器,因此子类化可能没有意义。在子类中,您只需调用super.init()即可。- 如果您只需要为ColorMonochrome过滤器添加一个额外的初始化程序,则可以定义一个扩展。(我已经准备了一个带有示例的答案,但我不确定那是否符合您的需求。) - Martin R
我已经更新了我的问题,试图澄清。 - Ashley Mills
1个回答

4

你的Objective-C类方法

+ (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue

实际上,返回的是 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)
    }
}

被称为

let filter = CIFilter(red: 0.1, green: 0.2, blue: 0.3)

好的,没问题,但是如果我真的想返回一个子类呢?带有额外属性,比如说?在这种情况下,似乎Swift比Objective-C更难实现...或者我漏掉了什么? - Ashley Mills
@AshleyMills:然后你只需要在子类的初始化器中调用super.init()。即使在ObjC中,[ASHColorMonochromeFilter filterWithName:...也不会返回ASHColorMonochromeFilter类的实例。 - Martin R
问题在于 - 超类(CIFilter)本身没有指定的初始器,但通过采用 NSCoding 实现了 init(coder: aDecoder)。那么调用 super.init(coder: nil) 是否可行? - Ashley Mills
@AshleyMills:就像我之前所说的那样,在你的子类初始化器中只需要调用super.init。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接