Return 来自初始值设定项而不初始化所有存储的属性正则表达式中的错误 class

Return from initializer without initializing all stored properties Error in a Regex class

我收到此错误消息 "Return from initializer without initializing all stored properties"

class Regex {
let internalExpression: NSRegularExpression
let pattern: String

init(_ pattern: String) {
    self.pattern = pattern
    var error: NSError?

    do {
        self.internalExpression = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
    } catch {
        print(error)
    }
}//Error Message Goes Here

func test(input: String) -> Bool {
    let matches = self.internalExpression.matchesInString(input, options: [], range:NSMakeRange(0, input.characters.count))
    return matches.count > 0
}

}

如果模式无效则 NSRegularExpression(pattern: pattern, ...) 失败并抛出错误,因此 self.internalExpression 不是 初始化。您不能在不初始化所有对象的情况下创建对象 属性。

所以你必须决定如何处理这种情况。一种选择是 是使初始化器 可失败:

init?(_ pattern: String) {
    self.pattern = pattern
    do {
        self.internalExpression = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
    } catch let error as NSError {
        print(error.localizedDescription)
        return nil
    }
}

然后调用者必须检查是否初始化成功:

if let regex = Regex("...") {
    // ...
} else {
    print("could not create Regex")
}

您还可以使初始化程序 throwing 并转发错误:

init(_ pattern: String) throws {
    self.pattern = pattern
    self.internalExpression = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
}

然后调用者必须捕获错误:

do {
    let regex = try Regex("...")
    // ...
} catch let error as NSError {
    print("could not create regex:", error.localizedDescription)
}

最后,如果无效模式被视为编程错误 在您的程序中,然后中止无效模式的执行:

init(_ pattern: String) {
    self.pattern = pattern
    do {
        self.internalExpression = try NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
    } catch let error as NSError {
        fatalError("could not create regex: " + error.localizedDescription)
    }
}