簡體   English   中英

比較嵌套枚舉

[英]Compare Nested Enums

如果我有

var currentState: TransformState = .Default
enum TransformState {
    case Default
    case Error(ErrorState)

    enum ErrorState {
        case Custom
        case Default
    }
}

var state = TransformState.Error(.Custom)

如何檢查state == currentState

您只需要為TransformState實現Equatable

TransformState.ErrorState是免費獲得的,因此您可以在實現中使用該事實:

extension TransformState: Equatable {}
func ==(lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true

    case let (.Error(lhsErrorState), .Error(rhsErrorState)):
        return lhsErrorState == rhsErrorState

    default:
        return false
    }
}

請注意,在Swift 3.0中,您將能夠將運算符重載置於擴展程序主體內。

您的問題與JAL所示的線程非常相似,因為您的嵌套枚舉為TransformState. ErrorState TransformState. ErrorState是相等的。

您可以編寫自己的==例如:

func == (lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true
    case (.Error(let state1), .Error(let state2)):
        return state1 == state2
    default:
        return false
    }
}
var currentState: TransformState = .Default

var state = TransformState.Error(.Custom)

print(state == currentState) //->false

currentState = .Error(.Custom)
print(state == currentState) //->true

為您的枚舉覆蓋==

func ==(lhs: TransformState, rhs: TransformState) -> Bool {
    switch (lhs, rhs) {
    case (.Default, .Default):
        return true

    case (.Error(.Custom), .Error(.Custom)):
        return true

    case (.Error(.Default), .Error(.Default)):
        return true

    default:
        return false
    }
}

暫無
暫無

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

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