从初始化程序返回而不初始化所有存储的属性Regex类中的错误

时间:2016-08-31 07:53:48

标签: regex swift swift2 initialization nsregularexpression

我收到这条错误消息,说明"从初始化程序返回而不初始化所有存储的属性"

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
}

}

1 个答案:

答案 0 :(得分:4)

如果模式无效,那么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")
}

您还可以创建初始值设定项throw并转发错误:

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)
    }
}