Swift - CIDetector子类中的Convenience初始化程序不起作用

时间:2016-12-21 19:33:14

标签: initialization swift3

我不明白为什么这不起作用?

import CoreImage

class RectDetector: CIDetector {

    convenience init?(aspectRatio: Float) {
        let options: [String : Any] = [CIDetectorAccuracy : CIDetectorAccuracyHigh,
                                       CIDetectorAspectRatio : NSNumber(value: aspectRatio)]
        self.init(ofType: CIDetectorTypeRectangle, context: nil, options: options)
    }

}

我收到错误“对成员init(aspectRatio:)的歧义”

如果我尝试像这样添加宽高比的默认值:

import CoreImage

class RectDetector: CIDetector {

    convenience init?(aspectRatio: Float = 1.0) {
        let options: [String : Any] = [CIDetectorAccuracy : CIDetectorAccuracyHigh,
                                       CIDetectorAspectRatio : NSNumber(value: aspectRatio)]
        self.init(ofType: CIDetectorTypeRectangle, context: nil, options: options)
    }

}

然后我收到错误“参数传递给不带参数的调用”

这是一个错误吗?为什么我不能使用链接到现有初始化程序的自定义便利初始化程序将CIDetector子类化?

P.S。我正在使用Xcode 8.2(8C38)

1 个答案:

答案 0 :(得分:2)

Swift导入一些类方法作为便利初始化器(Class Factory Methods and Convenience Initializers)。

在您的情况下,init(ofType:context:options:)是Objective-C CIDetector+ detectorOfType:context:options:的类方法。

这些便利初始化器在子类中不可用。这是一个自然的结论,基于这样一个事实,即类的工厂方法总是创建一个类的实例,它不能创建你定义的子类的实例。

因此,如果您想使用基于类工厂方法的便利初始化程序提供另一个便利初始化程序,您可能需要扩展名。

extension CIDetector {

    convenience init?(rectDetectorWithAspectRatio aspectRatio: Float) {
        let options: [String : Any] = [CIDetectorAccuracy : CIDetectorAccuracyHigh,
                                       CIDetectorAspectRatio : NSNumber(value: aspectRatio)]
        self.init(ofType: CIDetectorTypeRectangle, context: nil, options: options)
    }

}

顺便说一句,使用Swift,程序员似乎完全打破了诊断消息。您可以发送一个Bug Report