J'ai récemment téléchargé l'exemple d'application Advanced NSOperations à partir de Apple et j'ai trouvé ce code ...
// Operators to use in the switch statement.
private func ~=(lhs: (String, Int, String?), rhs: (String, Int, String?)) -> Bool {
return lhs.0 ~= rhs.0 && lhs.1 ~= rhs.1 && lhs.2 == rhs.2
}
private func ~=(lhs: (String, OperationErrorCode, String), rhs: (String, Int, String?)) -> Bool {
return lhs.0 ~= rhs.0 && lhs.1.rawValue ~= rhs.1 && lhs.2 == rhs.2
}
Il semble utiliser le ~=
opérateur contre Strings
et Ints
mais je ne l'ai jamais vu auparavant.
Qu'Est-ce que c'est?
Il s'agit d'un opérateur utilisé pour la correspondance de motifs dans une instruction case
.
Vous pouvez jeter un œil ici pour savoir comment vous pouvez l'utiliser et en tirer parti en fournissant votre propre implémentation:
Voici un exemple simple de définition d'un modèle personnalisé et de son utilisation:
struct Person {
let name : String
}
// Function that should return true if value matches against pattern
func ~=(pattern: String, value: Person) -> Bool {
return value.name == pattern
}
let p = Person(name: "Alessandro")
switch p {
// This will call our custom ~= implementation, all done through type inference
case "Alessandro":
print("Hey it's me!")
default:
print("Not me")
}
// Output: "Hey it's me!"
if case "Alessandro" = p {
print("It's still me!")
}
// Output: "It's still me!"
Utilisez simplement un raccourci vers "plage": vous pouvez construire une plage et "~ =" signifie "contient". (d'autres peuvent ajouter plus de détails théoriques, mais le sens est le suivant). Lisez-le comme "contient"
let n: Int = 100
// verify if n is in a range, say: 10 to 100 (included)
if n>=10 && n<=100 {
print("inside!")
}
// using "patterns"
if 10...100 ~= n {
print("inside! (using patterns)")
}
essayez avec quelques valeurs de n.
Est largement utilisé par exemple dans la réponse HTTP:
if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
let contentLength : Int64 = response.expectedContentLength
completionHandler(contentLength)
} else {
completionHandler(nil)
Vous pouvez regarder Définir Swift
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
func ~=<T>(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
func ~=<T : Equatable>(a: T, b: T) -> Bool
func ~=<I : ForwardIndexType where I : Comparable>(pattern: Range<I>, value: I) -> Bool