web-dev-qa-db-ja.com

〜=演算子Swift

最近、Advanced NSOperationsサンプルアプリをAppleからダウンロードし、このコードを見つけました...

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

StringsおよびIntsに対して~=演算子を使用しているようですが、これまで見たことがありません。

それは何ですか?

34
Fogmeister

これは、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!"
43

「範囲」へのショートカットを使用するだけです。範囲を構築でき、「〜=」は「含む」を意味します。 (他の人はより理論的な詳細を追加できますが、意味はこれです)。 「含む」と読む

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

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