2014-08-29 158 views
3

我试图按照以下步骤创建的CIFilter一个子类子类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协议,而不是init(name: String!)其在上CIFilter扩展声明。

我可以通过添加删除第一个错误:

required init(coder aDecoder: NSCoder!) { 
     super.init(coder: aDecoder) 
    } 

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

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


我想在这里实现的是这样做的雨燕相当于:

@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; 
    } 
+0

你真的想继承CIFilter以添加/覆盖方法,或者你只需​​要一个额外的初始化器? – 2014-08-29 18:12:44

+0

那么,在这种情况下,我想了解如何实现上述目标,如果可能的话 - 或者我的知识存在差距。 – 2014-08-29 19:35:33

+0

我不是这方面的专家,但据我了解,'init(name:“ColorMonochrome”)'加载了一个预定义的过滤器,所以子类化可能没有意义。在一个子类中,你只需要调用'super.init()'。 - 如果您只需要ColorMonochrome过滤器的附加初始化程序,那么您可以定义一个扩展。 (我已经用一个例子准备了答案,但我不确定这是否是您需要的。) – 2014-08-29 19:39:25

回答

3

你的Objective-C类方法

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

实际回报(一个子类的实例)的CIFilter。同样可以在斯威夫特实现 与便利初始化

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) 
+0

好吧,那很好,但如果我真的*想*会发生什么情况返回一个子类?有额外的属性,说?在这种情况下,Swift似乎比Objective-C更难......或者我错过了什么? – 2014-08-30 09:22:28

+0

@AshleyMills:那么你只需要在你的子类初始化器中调用super.init()。 - 即使在ObjC中,'[ASHColorMonochromeFilter filterWithName:...''不*返回ASHColorMonochromeFilter类的实例。 – 2014-08-30 09:26:36

+0

还有问题 - 超类('CIFilter')本身没有指定的初始化程序本身,而是通过采用NSCoding' init(coder:aDecoder)'。所以可以调用'super.init(coder:nil)'? – 2014-08-30 10:30:32