【问题标题】:Subclassing CIFilter in Swift在 Swift 中子类化 CIFilter
【发布时间】: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)
    }
}

我收到以下错误消息:

  1. 类“ColorMonochromeFilter”未实现其超类的 所需成员
  2. 必须调用指定的初始化器 超类“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 过滤器的附加初始化程序,那么您可以定义一个扩展。 (我已经准备了一个例子的答案,但我不确定这是否是你需要的。)
  • 我已更新我的问题以尝试澄清

标签: ios swift cifilter


【解决方案1】:

你的 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 更难……还是我遗漏了什么?
  • @AshleyMills:那么您只需在子类初始化程序中调用 super.init() 即可。 - 即使在 ObjC 中,[ASHColorMonochromeFilter filterWithName:... 确实返回您的 ASHColorMonochromeFilter 类的实例。
  • 还有一个问题——超类(CIFilter)本身并没有指定的初始化器,而是通过采用NSCodinginit(coder: aDecoder)。那么拨打super.init(coder: nil)是否可行?
  • @AshleyMills:正如我所说,您只需在子类初始化程序中调用 super.init。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多