~ = operador en Swift

Recientemente descargué la aplicación de ejemplo Advanced NSOperations de Apple y encontré este código …

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

Parece que usa el operador ~= contra Strings e Ints pero nunca lo había visto antes.

¿Qué es?

Es un operador utilizado para la coincidencia de patrones en una statement de case .

Puedes echar un vistazo aquí para saber cómo puedes usarlo y aprovecharlo proporcionando tu propia implementación:

Aquí hay un ejemplo simple de definir uno personalizado y usarlo:

 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!" 

Puedes ver Define 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 

simplemente use un acceso directo al range, puede build un range y "~ =" contiene. (otros pueden agregar más detalles teóricos, pero el sentido es este). Léelo como "contiene"

 let n: Int = 100 // verify if n is a range, sat: 10 to 100 (included) if n>=10 && n<=100{ print("inside!") } // using "patterns" if 10...100 ~= n{ print("inside! (using patterns)") } 

intente con algunos valores de n.

Se usa ampliamente, por ejemplo, en la respuesta HTTP:

 if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode { let contentLength : Int64 = response.expectedContentLength completionHandler(contentLength) } else { completionHandler(nil)