簡體   English   中英

快速模式與協議匹配

[英]Swift pattern matching with protocol

不知道這是編譯器中的錯誤還是我不知道的東西。

當與具體類型匹配時,我可以結合兩種情況:

    enum SomeEnum {
        case a, b, c
    }

    let param: (SomeEnum, Any) = something
    switch (param) {
        case (.a, let param as Int),
             (.b, let param as Int):
            print("a or b with solid type (Int) \(param)")
        default: print("none of above")
    }

但是,如果我想與類似的協議相匹配:

    switch (param) {
        case (.a, let param as Equatable),
             (.b, let param as Equatable):
            print("a or b with protocol \(param)")
        default: print("none of above")
    }

我得到Segmentation fault: 11在編譯期間。 解決方案是復制如下代碼:

    switch (param) {
        case (.a, let param as Equatable):
            print("a or b with protocol \(param)")
         case (.b, let param as Equatable):
            print("a or b with protocol \(param)")
        default: print("none of above")
    }

有人可以告訴我為什么會這樣嗎?

有點混亂。

我很確定將param為相等的值幾乎沒有用,並且不能以任何方式使用。 令我驚訝的是,它根本無法工作,因為它需要Self且在轉換為普通變量時不起作用。

我猜編譯器不應該做到兩個,但是您的第二個示例要么偶然運行,要么作為舊方法的殘余。 (作為一個補充說明,Switch模式匹配是由於需要大修,因此可能很快會產生適當的編譯器錯誤。)

我在想第一個不起作用的原因與使用多選項開關案例變量(這真是令人難以置信)時定義變量的方式有關。 如果它試圖將兩個不同的Equatable實例設置為同一變量,則基礎Type可能是兩個不同的Types,它甚至不應該嘗試,但是如果嘗試這樣做,它將在內部破壞某些內容。

我的猜測是,這已經被Swift 4報道或解決了,但是在Swift Bug跟蹤器上提交雷達和/或報告不會有什么壞處:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM