2016-08-31 3 views
1

je reçois ce message d'erreur qui dit: « Retour de initialiseur sans initialiser toutes les propriétés stockées »Retour de initialiseur sans initialiser toutes les propriétés stockées erreur dans une classe Regex

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 
} 

}

Répondre

3

Si le motif est invalide alors NSRegularExpression(pattern: pattern, ...) échoue et génère une erreur, de sorte que self.internalExpression n'est pas initialisé. Vous ne pouvez pas créer un objet sans initialiser toutes ses propriétés .

Vous devez donc décider comment gérer cette situation. Une option serait est de faire le initialiseur failable:

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

Ensuite, l'appelant doit vérifier si l'initialisation a réussi:

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

Vous pouvez également faire le initialiseur throw ment et en avant la erreur:

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

Puis l'appelant doit attraper l'erreur:

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

Enfin, si un motif non valide est considéré comme une erreur de programmation dans votre programme, puis abandonner l'exécution pour un motif non valable:

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