【发布时间】:2014-08-29 16:56:02
【问题描述】:
我正在尝试创建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)
}
}
我收到以下错误消息:
- 类“ColorMonochromeFilter”未实现其超类的 所需成员
- 必须调用指定的初始化器 超类“CIFilter”
由于CIFilter符合NSCoding协议,指定的初始化器似乎是init(coder aDecoder: NSCoder!),而不是在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 以添加/覆盖方法,还是只需要一个额外的初始化程序?
-
好吧,在这种情况下,我想了解如何实现上述目标,如果可能的话 - 或者如果我的知识存在差距。
-
我并不是这方面的专家,但据我所知,
init(name: "ColorMonochrome")会加载一个预定义的过滤器,因此子类化可能没有意义。在子类中,您只需调用super.init()。 - 如果您只需要 ColorMonochrome 过滤器的附加初始化程序,那么您可以定义一个扩展。 (我已经准备了一个例子的答案,但我不确定这是否是你需要的。) -
我已更新我的问题以尝试澄清