Я пытаюсь создать подкласс 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.
Похоже, что назначенным инициализатором является init(coder aDecoder: NSCoder!)
из-за того, что CIFilter
соответствует протоколу NSCoding
, а не init(name: String!)
, который объявлен в расширении CIFilter
.
Я могу удалить первую ошибку, добавив:
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;
}
init(name: "ColorMonochrome")
загружает предопределенный фильтр, поэтому создание подклассов может не иметь смысла. В подклассе вы просто вызоветеsuper.init()
. - Если вам просто нужен дополнительный инициализатор для фильтра ColorMonochrome, вы можете определить расширение. (Я подготовил ответ с примером, но я не уверен, что это то, что вам нужно.) - person Martin R   schedule 29.08.2014