Subclassing CIFilter in Swift
I am trying to create a subclass CIFilter
like this:
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)
}
}
The following error messages appear:
- Class 'ColorMonochromeFilter' does not implement its superclass required members
- Must call the designated initializer superclass 'CIFilter'
It seems that the designated initializer is init(coder aDecoder: NSCoder!)
due to CIFilter
conforming to the protocol NSCoding
rather than the init(name: String!)
one declared in the extension on CIFilter
.
I can remove the first error by adding:
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
(although it seems a little overkill!)
Is there a way to solve the second problem?
What I am trying to achieve is the Swift equivalent:
@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;
}
source to share
Your Objective-C class method
+ (ASHColorMonochromeFilter *) filterWithRed: (CGFloat) red green:(CGFloat)green blue:(CGFloat)blue
returns the actual instance (subclass) CIFilter
. The same can be achieved in Swift with a convenience initializer
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)
}
}
which is called
let filter = CIFilter(red: 0.1, green: 0.2, blue: 0.3)
source to share