簡體   English   中英

從沒有 switch/case 的枚舉中獲取關聯值

[英]Get associated value from enumeration without switch/case

我有一些不同類型的不同案例的枚舉,例如

enum X {
    case AsInt(Int)
    case AsDouble(Double)
}

我可以switch這些就好獲得潛在價值退了出去。 然而, switch語句非常煩人,它試圖讓我為我根本不關心的其他情況執行一些代碼。 例如,現在我有類似的東西

func AsInt(x: X) -> Int? {
    switch x {
    case AsInt(let num):
        return num;
    default:
        return nil;
    }
}

這很有效,但總是必須引用此方法並且必須為每個枚舉的每個案例編寫一個新方法,這非常乏味。 我正在尋找的是如何簡單地嘗試將X類型的值轉換為其中一種情況,例如

var object: X = func();
let value = obj as? Int;
if value {
    // do shit
}

我怎樣才能簡單地檢查一個案例而不必列舉所有我不關心的案例並為他們執行一些非聲明?

任何可以將value聲明為條件的一部分而不是污染范圍的解決方案的獎勵積分。

實際上有多種方法可以做到。

讓我們通過使用計算屬性擴展您的枚舉來實現:

enum X {
    case asInt(Int)
    case asDouble(Double)

    var asInt: Int? {
        // ... see below
    }
}

if case解決方案

通過let外面:

var asInt: Int? {
    if case let .asInt(value) = self {
        return value
    }
    return nil
}

通過let里面:

var asInt: Int? {
    if case .asInt(let value) = self {
        return value
    }
    return nil
}

guard case解決方案

通過let外面:

var asInt: Int? {
    guard case let .asInt(value) = self else {
        return nil
    }
    return value
}

通過let里面:

var asInt: Int? {
    guard case .asInt(let value) = self else {
        return nil
    }
    return value
}

最后一個是我個人最喜歡的四種解決方案的語法。

從 Swift 2 (Xcode 7) 開始,這可以通過if/case和模式匹配實現:

let x : X = ...
if case let .AsInt(num) = x {
    print(num)
}

num的范圍僅限於 if 語句。

暫無
暫無

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

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