'self' 在 'catch' 块内使用,可从 super.init 调用访问

'self' used inside 'catch' block reachable from super.init call

此代码未在 Swift 3.3 上编译。它显示消息:'self' used inside 'catch' block reachable from super.init call

public class MyRegex : NSRegularExpression {

    public init(pattern: String) {
        do {
            try super.init(pattern: pattern)
        } catch {
            print("error parsing pattern")
        }
    }

}

那会是什么?

如果 super.init 失败,则对象未完全初始化,在这种情况下,您的初始化程序也必须失败。

最简单的解决方案是 throwing:

public class MyRegex : NSRegularExpression {

    public init(pattern: String) throws {
        try super.init(pattern: pattern)
        // ...
    }

}

或者作为可失败的初始化器:

public class MyRegex : NSRegularExpression {

    public init?(pattern: String)  {
        do {
            try super.init(pattern: pattern)
        } catch {
            print("error parsing pattern:", error.localizedDescription)
            return nil
        }
        // ...
    }
}