J'ai une structure personnalisée avec quelques champs, et je voudrais créer une correspondance switch
déclaration afin que je puisse personnaliser la correspondance, en comparant l'un des champs à une regex.swift 4: le motif correspond à un objet par rapport à un tuple (le motif de tuple ne peut pas correspondre aux valeurs du type non-tuple)
E.g. Compte tenu de cette structure:
struct MyStruct {
let header: String
let text: String
}
J'avais comme à correspondance de motif comme celui-ci:
switch(someInstance) {
case ("h1", "[a-z]+"): ...
case ("h1", "0-9+"): ...
}
J'ai essayé d'obtenir ce à travailler en utilisant une fonction d'appariement de formes comme suit:
func ~=(pattern: (String, String), value: MyStruct) -> Bool {
return value.header == pattern.0 && value.text.range(of: pattern.1, options: .regularExpression) != nil
}
Mais Xcode (9) ne parvient pas à compiler avec cette erreur:
motif Tuple ne peut pas correspondre à des valeurs du type non-tuple « MyStruct »
Le meilleur que je suis en mesure d'atteindre est le suivant:
struct MatchMyStruct {
let header: String
let regex: String
init(_ header: NSString, _ regex: String) {
self.header = header
self.regex = regex
}
}
func ~=(pattern: MatchMyStruct, value: MyStruct) -> Bool {
return value.header == pattern.header && value.text.range(of: pattern.regex, options: .regularExpression) != nil
}
Cela me permet de correspondance de motif comme celui-ci:
switch(someInstance) {
case MatchMyStruct("h1", "[a-z]+"): ...
case MatchMyStruct("h1", "0-9+"): ...
}
Bien que ce soit fonctionnel, je préférerais de loin ne pas avoir les wrappers MatchMyStruct
explicite comme ça.
Il semble qu'il y ait une sauce secrète magique pour la correspondance de motifs avec des tuples qui gênent. Y a-t-il quelque chose que je puisse faire ici?
Est-ce que 'switch ((someInstance.header, someInstance.text))' fonctionnerait? – vacawama
@vacawama c'est une bonne idée. Je l'ai essayé mais malheureusement ça n'a pas fonctionné et j'avais toujours le motif 'Tuple pattern ne peut pas correspondre ...' –