~ = Swift 中的操作符

我最近从苹果公司下载了 高级国家安全行动样本应用程序,发现了这个代码..。

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

它似乎使用 ~=操作符对抗 StringsInts,但我以前从未见过它。

这是什么?

32573 次浏览

你可以查 什么叫斯威夫特

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

它是一个操作符,用于在 case语句中执行模式匹配。

您可以在这里了解如何使用和利用它来提供您自己的实现:

下面是定义一个自定义的并使用它的一个简单示例:

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

简单地使用作为“ range”的快捷方式: 您可以构造一个 range,“ ~ =”表示“包含”。 (其他可以添加更多的理论细节,但意思是这样)

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


}

尝试一些 n 的值。

被广泛使用,例如在 HTTP 响应中:

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