web-dev-qa-db-fra.com

~ = opérateur dans Swift

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?

34
Fogmeister

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!"
43
Alessandro Orrù

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)
31
ingconti

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
1
Rahul Tripathi